- 定义函数解决约瑟夫环问题:
一群小朋友(数量为 n)围坐一圈,从第 k 个(默认 k=0)小朋友开始数数,从 1 开始数到 m(默认为 3),数字为 m 的小朋友退出,然后下面的小朋友继续从 1 开始数,当一圈数完以后,第一个小朋友接着最后一个小朋友的数字继续,一直到只剩下一个小朋友,请问最后一个留下的是开始编号为多少的小朋友?
要求:为函数增加说明部分(使用 help 可查看);函数的返回值为小朋友的编号;可使用递归(不推荐)。
def func(n, k=0, m=3):
"""
定义函数解决约瑟夫环问题
@param n: 小朋友总数
@param k: 从第 k 个开始
@param m: 从 1 数到 m 退出该小朋友
@return: 最后留下的编号
"""
lst = list(range(0, n))
cnt = 1
cnt_rest = n
flag = True
while cnt_rest != 1:
if cnt % m == 0 and flag is True:
lst[k] = -1
cnt_rest -= 1
k += 1
if k >= n:
k = 0
if lst[k] != -1:
cnt += 1
flag = True
else:
flag = False
return list(filter(lambda x: x != -1, lst))
print(func(3))
- 定义一个高阶函数,用于计算传入值(任意多个)的阶乘,并返回结果除以 3 余 1 的值。
def fact(n):
"""
求阶乘
@param n: 参数
@return: 阶乘
"""
if n == 0 or n == 1:
return 1
return n * fact(n - 1)
def func(*nums):
return list(filter(lambda x: fact(x) % 3 == 1, nums))
print(func(1, 2, 4, 3, 1))