阶乘
1 # 阶乘
2
3 def jiecheng(n):
4 if n <= 1:
5 return 1
6 return jiecheng(n-1) * n
7
8 print(jiecheng(5))
9
10
11 # 阶乘_尾递归
12 def jiecheng(n, val):
13 if n == 1:
14 return val
15 return jiecheng(n-1, val*n)
16
17 res = jiecheng(5, 1)
18 print(res)
斐波那契
1 # 斐波那契
2 def fbnq(n):
3 # 第一个数和第二个数是1
4 if n == 1 or n == 2:
5 return 1
6 # 返回上一个数加上上上个数
7 return fbnq(n-1) + fbnq(n-2)
8
9
10 # 斐波那契_尾递归
11 def fbnq(n, tem, total):
12 if n == 1:
13 return tem
14 return fbnq(n-1, total, tem+total)
青蛙跳台阶
1 '''
2 一只青蛙要跳上n层高的台阶
3 一次能跳一级,也可以跳两级
4 请问这只青蛙有多少种跳上这个n层高台阶的方法?
5 '''
6
7
8 def tiao(n):
9 # 当n为1 的时候只有一种方法条台阶
10 if n == 1:
11 return 1
12 # 当n为2 的时候有两种方法上台阶
13 if n == 2:
14 return 2
15 # 与斐波那契相似, 这次台阶的次数是:上次台阶的次数加上上次台阶的次数
16 return tiao(n-2) + tiao(n-1)
17
18 print(tiao(6))
翻转字符串
'''
底层递归反转字符串 "将14235 反转成53241"
'''
def fanzhuan(s):
if len(s) == 0:
return s
else:
# s[1:]传入下个递归函数, s[0]保留在本层递归函数
# 等递归开始return, 内层递归依次+=外层递归的s[0], 实现反转
return fanzhuan(s[1:]) + s[0]
# 翻转字符串_尾递归
# s: 需要翻转的字符串
# re_s: 递归结束后return的翻转字符
def fanzhuan(s, re_s=''):
# 如果传入的str长度为0, 证明str已经被翻转完毕, 返回re_s
if len(s) <= 0:
return re_s
# 除最后一个外, 其余字符串全部传入下层递归函数
# 本层最后一个str与上一层函数最后一个str相加
return fanzhuan(s[:-1], re_s+s[-1])
print(fanzhuan('abdce'))
def fanzhuan(s):
# 传入的str长度为0返回空str, 等待 += 上层的s[0]
if len(s) <= 0:
return ''
# 切片除第一个str外都传入下层递归函数,
# 然后等待下层递归函数返回 += s[0]
return fanzhuan(s[1:]) + s[0]
print(fanzhuan('abcdef'))
猴子吃桃
1 '''
2 猴子吃桃
3 并吃了一半,又多吃了一个
4 又将剩下的桃吃一半,又多吃了一个
5 都吃了剩下的一半又多一个
6 到了第10天早上在吃时,却发现只剩下一个桃
7 问!第一天共摘了多少?
8 '''
9
10 def houzi(day):
11 # 如果是第十天就返回1(1个桃子)
12 if day == 10:
13 return 1
14 else:
15 return (houzi(day+1) +1) * 2
16
17
18 def houzi(day, n):
19 if day == 1:
20 return n
21 else:
22 return houzi(day-1, (n+1)*2)