递归
-
定义
简单地说一个函数不断的调用自己就是递归
- 必须有一个明确的结束条件也叫递归出口
- 每次进入更深一层的递归时,问题规模相比上一次递归都应有所减少
- 递归效率不高,递归的层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,当本次函数调用完会将结果保存在栈中,称为压栈,然后在执行下一次,栈的特点是先进后出,由于栈的大小不是无限的,所以,递归调用的次数过多会导致栈溢出
def info(x): if x == 0: return 0 s = info(x - 1) + x print(x) # 递归在入栈是3 2 1入栈出栈的时候就应该是1 2 3 return s print(info(3))
''' 小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半, 又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现, 只剩下一个桃子了.问第一天猴子共摘多少个桃子? ''' i = 1 b = 1 while i < 10: c = (b + 1) * 2 b = c i += 1 print(c) # 在这里 # 递归求解 def info(n): if n == 10: return 1 s = (info(n + 1) + 1) * 2 return s n1 = info(1) sums = (n1 + 1) * 2 print("总共有桃%d" % sums) for i in range(1, 11): print("第%d天吃了%d" % (i, info(i)))
def duck(n): if n == 7: return 2 else: tmp = (duck(n + 1) + 1) * 2 return tmp n1 = duck(1) init = (n1 + 1) * 2 print("总共有%d只鸡" %init) for i in range(1,8): print("第 %d 天 卖了%d只" % (i, duck(i)))
#问路如果这个人不知道会去问下一个,如果问到了会依次将结果返回上一级 li = ['a', 'b', 'c', 'd'] def wenlu(a): print("*"*60) if len(a) == 0: return "根本没人知道" person = a.pop(0) if person == 'd': return "这里" print("我也不知道,我问一下%s" %a) res = wenlu(a) print('%s问的结果是%s' %(person,res)) return res wenlu(li) #结果 ************************************************************ 我也不知道,我问一下['b', 'c', 'd'] ************************************************************ 我也不知道,我问一下['c', 'd'] ************************************************************ 我也不知道,我问一下['d'] ************************************************************ c问的结果是这里 b问的结果是这里 a问的结果是这里
#简单递归求阶乘 def a(k): if k == 0: sums = 1 else: sums = k * a(k-1) return sums print(a(9))
#递归小练习倒序输出 import time def output(a, b): if b-1 < 0: return time.sleep(2) print(s[b - 1]) output(s, b-1) s = input("输入一串字符") l = len(s) output(s, l) #用切片来实现 s = input("请输入:") print("原来的:", s) a = s[::-1] print("反转", a)
# 有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子? def rabbit(n): if n == 1: return 1 if n == 2: return 1 return rabbit(n-2) * 2 print(rabbit(9))