如何使用递归找到1+(1 * 2)+(1 * 2 * 3)…(1 * 2 * 3 * ... n)系列的总和?

时间:2019-09-23 23:34:35

标签: python python-3.x recursion

这就是我到目前为止的情况,

def factorial(n):
  if n == 0:
    return 1 
  else: 
    return n * factorial(n-1)

计算阶乘,但是如何将总和相加?

6 个答案:

答案 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)

您的逻辑差不多很好,我已经更正了。请在下面检查。

  

您可以通过https://rextester.com/AGS44863

在线尝试
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

(这似乎比blhsing的faster稍微answer。)

答案 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))