数据结构和算法:消除尾递归(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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律