题目👇
(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)