from functools import reduce as _r
def fact_sum(n, f = True):
if not f and n:
yield from [n, *fact_sum(n - 1, f = False)]
if f and n:
new_n = _r(lambda x, y:x*y, list(fact_sum(n, f = False)))
yield from [new_n, *fact_sum(n - 1, f = True)]
print(sum(fact_sum(3)))
print(sum(fact_sum(4)))
增加了在实践中用于这些类型递归函数的记忆,通过消除重复计算来提高效率(即https://www.python-course.eu/python3_memoization.php)
@DarryIG和@bkbb的答案会起作用,但效率很低,因为它会对相同的数字进行重复的递归调用,对于较高的数字,这些调用的结果是相同的。您可以缓存结果以提高效率。你知道吗
此外,由于:
实现递归实际上不需要两个函数:
因此
sum_factorials(4)
返回:使用
functools.reduce
进行乘法的带生成器的替代单一递归解决方案:输出:
相关问题 更多 >
编程相关推荐