函数的递归调用:是函数嵌套调用的一种特殊形式
具体是指:
在调用一个函数的过程中又直接或者间接地调用到本身
# 直接调用本身 def f1(): print(‘是我是我还是我‘) f1() f1()
# 间接接调用本身 def f1(): print(‘===>f1‘) f2() def f2(): print(‘===>f2‘) f1() f1()
# 一段代码的循环运行的方案有两种 # 方式一:while、for循环 while True: print(1111) print(2222) print(3333) # 方式二:递归的本质就是循环: def f1(): print(1111) print(2222) print(3333) f1() f1()
递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用
n=0 while n < 10: # 设置循环结束条件 print(n) n+=1 def f1(n): if n == 10: # 设置递归结束条件 return print(n) n+=1 f1(n) f1(0)
补充:
‘‘‘ 1. 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000,虽然可以使用 sys.setrecursionlimit()去设定该值,但仍受限于主机操作系统栈大小的限制 2. python不是一门函数式编程语言,无法对递归进行尾递归优化。 ‘‘‘
回溯:一层一层调用下去
递推:满足某种条件,结束递归,然后一层一层返回
# salry(4) = age(3) + 1000 # salry(3) = age(2) + 1000 # salry(2) = age(1) + 1000 # salry(1) = 5000 def salary(n): if n == 1: return 5000 return age(n-1) + 1000 res=age(4) print(res) # 8000
l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]] def f1(list1): for x in list1: if type(x) is list: # 如果是列表,应该再循环、再判断,即重新运行本身的代码 f1(x) else: print(x) f1(l)
法一:函数递归得到第n项斐波拉契数列,循环函数得到数列
def print_Fibonacci(n): for i in range(1,n+1): print(Fibonacci(i),end=" ") print() def Fibonacci(n): if n == 1 or n == 2: return n-1 elif n > 2: return Fibonacci(n-2) + Fibonacci(n-1) return -1 print(Fibonacci(15)) print_Fibonacci(15)
法二:设定数列初始的两个值与数列终止值,每次替换初始值为平移一个单位后的两个值,并打印
def fib(a,b,c): if a > c: return print(a,end=" ") fib(b,a+b,c) fib(0,1,388)
法三:非递归方法实现
def fib2(max): a=0 b=1 while a< max: yield a a, b=b, a+b g = fib2(500) for i in g: print(i,end=" ")
def hannuota(n,A="A",B="B",C="C"): if n == 1: print(f"将第{n}块积木从{A}柱放到{C}柱") return hannuota(n-1,A,C,B) print(f"将{n}块积木从{A}柱子放到{C}柱子") hannuota(n-1,B,A,C) n = input("请输入汉诺塔层数:") if n.isdigit(): n = int(n) hannuota(n) else: print("请输入数字")
原文:https://www.cnblogs.com/zhubincheng/p/12570689.html