简单地说一个函数不断的调用自己就是递归
- 必须有一个明确的结束条件也叫递归出口
- 每次进入更深一层的递归时,问题规模相比上一次递归都应有所减少
- 递归效率不高,递归的层次过多会导致栈溢出(在计算机中,函数调用是通过栈(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))