zoukankan      html  css  js  c++  java
  • 数据结构和算法:消除尾递归(Python)

    递归是非常基本的算法,虽然非常好用,但是也非常耗费空间资源,所以编程中在保证代码简洁性和可读性的前提下,如果可以不使用递归则尽量不使用递归。而尾递归则是一种可以在不使用其他辅助空间的情况下被消除的递归:如果一个函数的递归调用和调用的返回值总是在函数的末尾,且返回值不包括在表达式中,则这种递归通常称之为尾递归。尾递归是可以通过循环来达到相同目的的,平常开发的时候如果没有注意这种情况的话,很容易踩到这个坑。

    尾递归示例

    使用二分查找算法实现查找一个列表中是否包含指定元素。

    使用递归实现(尾递归):

    def binary_search(data, item, low, high):
        mid = (low + high) // 2
        if low > high:
            return False
        elif item == data[mid]:
            return True
        elif item < data[mid]:
            return binary_search(data, item, low, mid - 1)
        else:
            return binary_search(data, item, mid + 1, high)
    

    使用循环实现(消除尾递归):

    def binary_search(data, item):
        low = 0
        high = len(data) - 1
        while low <= high:
            mid = (low + high) // 2
            if item == data[mid]:
                return True
            elif item < data[mid]:
                high = mid - 1
            else:
                low = mid + 1
    
        return False
    

    注意,虽然递归调用的返回值在函数最后且返回了,但调用本身的返回值属于表达式的一部分,那这种递归就不属于尾递归了(虽然不属于尾递归,如果可以不用递归实现,也可以考虑其他更好的方法)。

    # 求一个正整数的阶乘
    def factorial(n):
        if n == 0:
            return 1
        else:
            return n * factorial(n - 1)
    
  • 相关阅读:
    VLC 播放完毕后自动退出的问题
    配置Linux文件句柄数
    java获取某一天的邮件
    oracle wm_concat函数将多行转字段函数
    Vue学习(二十五)TS支持
    Vue学习(二十四)render函数
    Vue学习(二十三)路由全攻略
    git commit规范&工具安装使用
    Vue学习(二十二)自定义指令全攻略
    Vue学习(二十一)$emit全攻略
  • 原文地址:https://www.cnblogs.com/guyuyun/p/15106755.html
Copyright © 2011-2022 走看看