Python-递归练习题

1、求阶乘

 1 # no 1
 2 def facl(n):
 3     if n == 1:
 4         return 1
 5     return  facl(n-1) * n
 6  # return 1 if n ==1 else facl(n-1) * n
 7 print(facl(3))
 8 # no 2
 9 def facl1(n,a=1):# 利用之前的值
10     if n == 1:
11         return a
12     a = a * n
13     return facl1(n-1, a)
14 
15 print(facl1(3))

2、猴子吃桃

 1 '''
 2 
 3 问题简述:一只小猴子吃桃子的问题。
 4 话说,一只小猴子第一天摘下若干个桃子,并吃了一半。
 5 感觉到吃的还不瘾,于是又多吃了一个;
 6 第二天早上,又将剩下的桃子吃掉一半,又多吃了一个。
 7 以后每天早上,都吃了前一天剩下的一半零一个。
 8 python问题:
 9 请问,到了第10天早上想再吃时,却发现只剩下一个桃子了。
10 求第一天共摘了多少?
11 
12 # 逆向思维
13 s2 = 1
14 for day in range(9,0,-1):
15     s1 = (s2 + 1)*2
16     s2 = s1
17 print(s1)
18 '''
19 # no 1
20 def foo(n=10, a=1): # n = 10 是因为 当n = 2的时候已经是答案了,但是此时的 获取不到a 要等 n==1 的时候去获取a
21     if n == 1:
22         return a
23     a = (a + 1) * 2
24     return  foo(n-1, a)
25 
26 print((foo(10))) # 1534
27 
28 # no 2    n只是一个循环条件
29 def foo(n=10):
30     if n == 1:
31         return 1
32     return (foo(n-1) + 1) * 2
33 
34 print(foo())
35 
36 def foo(n=1):
37     if n == 10:
38         return 1
39     return (foo(n+1) + 1) * 2
40 
41 print(foo())

 3、将一个数逆序放入列表中 如:1234----【4,3,2,1】

 1 # no 1 使用字符串索引
 2 l = '1234'
 3 length = len(l)
 4 def foo(length , lst=[]):
 5     if length == 0:
 6         return lst
 7     lst.append(l[length-1])
 8     return foo(length-1,lst)
 9 
10 print((foo(length))) # ['4', '3', '2', '1']
11 
12 # 递归去字符
13 l = '1234'
14 
15 def revert(x):
16     if x == -1:
17         return []
18     return [l[x]] + revert(x-1) # 每次生成新的列表
19 
20 print(revert(len(l) - 1)) # 索引取
21 
22 # no 3
23 l = '1234'
24 
25 def foo(x, target=[]):
26     if x:
27         target.append(x[-1])
28         foo(x[:-1]) # 每次切片,每次都娶不到最后一个数字,(这里递放在函数体内)
29     return target
30 
31 print(foo(l))
32 
33 # no 4 使用数字整除 取模递归,使用了 divmod() 内建函数
34 def foo(x, target=None):# 使用缺省值None 而不是用[] ,避免修改函数的属性
35     if target == None:
36         target = []
37     x, v = divmod(x, 10)
38     target.append(v)
39     if x == 0:
40         return target
41     return foo(x, target)  # 
42 
43 print(foo(1234)) # [4, 3, 2, 1]

 

转载于:https://www.cnblogs.com/JerryZao/p/9531951.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值