您好!此笔记的文本和代码以网盘形式分享于文末!
因个人能力有限,错误处欢迎大家交流和指正!基础部分内容简单,但多且零散!
python递归函数 | ||
人理解循环,神理解递归,BUT龟叔拒绝py加入尾递归优化 | ||
递归的定义——在一个函数内部再调用这个函数本身,py强制的将递归层数控制在了998 | ||
递归函数的优点是定义简单,逻辑清晰,理论上所有的递归函数都可以写成循环的方式, 但循环的逻辑不如递归清晰 | ||
函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出, | ||
尾递归:python 不支持尾递归 | ||
尾递归优化:尾递归优化是解决递归调用栈溢出的方法,事实上尾递归和循环的效果是一样的, 所以,把循环看成是一种特殊的尾递归函数也是可以的 | ||
用法 | 栗子 | 结果 |
递归函数默认深度 998 | def foo(n): print(n) n += 1 foo(n) foo(0) | 993 994 995 996 997Traceback (most recent call last): |
改变递归函数默认深度 测试发现不十分准确 不建议修改使用 | import sys sys.setrecursionlimit(2000) def foo(n): print(n) n += 1 foo(n) foo(0) | 1994 1995 1996 1997Traceback (most recent call last): |
详解递归函数 递归实例 | def example(n): print(n) if n > 0: example(n - 1) else: print('*******') print(n) example(3) | 3 2 1 0 ******* 0 1 2 3 |
详解递归函数 实例解析 | example(3): | |
print(3) | 3 | |
if 3 > 0: | ||
example(2): | ||
print(2) | 2 | |
if 2 > 0: | ||
example(1): | ||
print(1) | 1 | |
if 1 > 0: | ||
example(0): | ||
print(0) | 0 | |
else: | ||
print('*******') | ******* | |
print(0) | 0 | |
print(1) | 1 | |
print(2) | 2 | |
print(3) | 3 | |
递归和循环 循环for | def sum_cycle1(n): sum1 = 0 for i in range(1, n+1): sum1 += i return sum1 print('循环for求和:', sum_cycle1(100)) | 循环for求和: 5050 |
递归和循环 循环while | def sum_cycle2(n): sum1 = 0 while n > 0: sum1 += n n -= 1 return sum1 print('循环while求和:', sum_cycle2(100)) | 循环while求和: 5050 |
递归和循环 递归 | def sum_recu(n): if n > 0: return n + sum_recu(n-1) # 调用函数自身 else: return 0 print('递归求和:', sum_recu(100)) | 递归求和: 5050 |
递归函数和三级菜单 | ||
递归和二分法 | ||
递归与斐波那契数列 普通递归实现 | def fib(n): if n < 2: return n else: return fib(n - 1) + fib(n - 2) | |
递归与斐波那契数列 尾递归实现 | def fib_tail(n, r, t): if n == 1: return r else: return fib_tail(n - 1, t, r + t) | |
尾递归优化 | 欠 |
愿有更多的朋友,在网页笔记结构上分享更逻辑和易读的形式:
链接:暂无
提取码:暂无