这就是我到目前为止的情况,
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
计算阶乘,但是如何将总和相加?
答案 0 :(得分:5)
@DarryIG和@bkbb的答案会起作用,但效率不高,因为对于较高的数字,它会反复使用相同的数字进行重复的递归调用,其结果相同。您可以缓存结果以提高效率。
此外,由于:
sum_factorials(n) = (sum_factorials(n-1) - sum_factorials(n-2)) * n + sum_factorials(n-1)
您实际上不需要两个函数来实现递归:
def sum_factorials(n, cache=[0, 1]):
if len(cache) > n:
return cache[n]
previous = sum_factorials(n - 1)
cache.append((previous - sum_factorials(n - 2)) * n + previous)
return cache[n]
使sum_factorials(4)
返回:
33
答案 1 :(得分:0)
添加了备忘录,将在实践中用于这些类型的递归函数,以通过删除重复计算(即https://www.python-course.eu/python3_memoization.php)来提高效率
def memoize(f):
memo = {}
def helper(x):
if x not in memo:
memo[x] = f(x)
return memo[x]
return helper
@memoize
def sum_of_factorial(n):
if n==0:
return 0
return factorial(n) + sum_of_factorial(n-1)
@memoize
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
答案 2 :(得分:0)
使用生成器的替代性单递归解,使用functools.reduce
进行乘法:
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)))
输出:
9
33
答案 3 :(得分:0)
您的逻辑差不多很好,我已经更正了。请在下面检查。
在线尝试
def factorial(n):
if n == 0:
return 0
else:
mul_sum = 1
for i in range(1, n + 1):
mul_sum *= i
return factorial(n-1) + mul_sum
print(factorial(4)) # 33
为确保上面的命令是正确的,您还可以查看下面的函数,该函数使用递归形成表达式(字符串)。
def factorial_expression(n):
if str(n) == '0':
return ""
else:
if n == 1:
return "1"
mul_sum = "("
for i in range(1, n + 1):
mul_sum += str(i) + "*"
return (factorial_expression(n-1) + "+" + mul_sum.rstrip("*") + ")").lstrip("+")
# 1+(1*2)+(1*2*3)+(1*2*3*4)
print(factorial_expression(4))
答案 4 :(得分:0)
我不确定为什么我们需要任何减法或缓存。递归可以向前和向后:
def f(n, i=1, factorial=1, result=1):
if i == n:
return result
next = factorial * (i + 1)
return f(n, i + 1, next, result + next)
print(f(4)) # 33
答案 5 :(得分:-1)
不确定数学是否正确,也许不是,但是您可能想要定义一个方法并进行迭代,因为我正在猜测:
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
def sum_of_factorial(n):
sum_output = 0
while n >= 0:
sum_output += factorial(n)
n -= 1
return sum_output
print(factorial(10))
print(sum_of_factorial(10))