【Python】练习题——函数相关(lambda表达式和filter、sum函数、递归)

题目👇

(1)一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编写程序找出1000以内的所有完数,要求结合使用lambda表达式和filter、sum函数。

(2)假设一段楼梯共n个台阶,小明一步最多能上3 个台阶,编写递归函数计算小明上这段楼梯一共有多少种方法。

(3)假设一段楼梯共n个台阶,小明一步最多能上3 个台阶,编写程序列出小明上这段楼梯的所有方法,如n=5时,得到

 [(1, 1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 2, 1), (1, 1, 3), (1, 2, 1, 1), (1, 2, 2), (1, 3, 1), (2, 1, 1, 1), (2, 1, 2), (2, 2, 1), (2, 3), (3, 1, 1), (3, 2)]

其中(2, 1, 2)表示小明可以先上2级台阶,再上1级台阶,然后在上2级台阶即可上去,以此类推;

解题思路👇

(1)首先创建一个所有小于x的因子的列表,再用sum()函数对这个列表的元素进行求和,结果再与x进行比较,构成lambda匿名函数的返回值,lambda函数的参数自然就是x了。

最后把构造好的lambda函数作为筛选条件调用filter函数,filter()函数一共两个参数,第一个是筛选条件,第二个是筛选范围,筛选范围是列表1~1000,也就是range(1,1000)。

值得注意的是,filter()函数的返回值是一个类,我们需要用list()类型转换把它转换成列表再打印出来就可以了。

(2)核心思路是函数递归调用,明确递归表达式f(n)=f(n-1)+f(n-2)+f(n-3),这里要注意递归终止条件的设定,为了避免多统计要在n<0时返回0,而在n=0时返回1,代表1种走法。

(3)核心思路雷同八皇后问题的回溯法,用一个列表变量x来记录走法,递归遍历所有可能,如果sum(x)==n,那么这就是一种走法,打印出x,随后再回溯到上一步尝试其他的可能……

参考代码👇

#coding:utf-8
#author:Mitchell

#part1:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编写程序找出1000以内的所有完数,要求结合使用lambda表达式和filter、sum函数 
print(list(filter(lambda x:sum([i for i in range(1,x) if x%i == 0]) == x,range(1,1000))))

#part2:假设一段楼梯共n个台阶,小明一步最多能上3个台阶,编写递归函数计算小明上这段楼梯一共有多少种方法。
def climb_stairs_method_number(n):
    if n<0:
        return 0
    if n==0:
        return 1
    return climb_stairs_method_number(n-1)+climb_stairs_method_number(n-2)+climb_stairs_method_number(n-3) 
n=int(input('请输入台阶总数n:'))
print('一共有',climb_stairs_method_number(n),'种走法')

#part3:假设一段楼梯共n个台阶,小明一步最多能上3个台阶,编写程序列出小明上这段楼梯的所有方法
def climb_stairs_method(n):
    if sum(x)>n:
        return
    if sum(x)==n:
        print(x)
    for i in range(1,4):
        x.append(i)
        climb_stairs_method(n)
        x.pop()
x=[]
climb_stairs_method(n)

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mitch311

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值