在Python中使用递归的指数总和

时间:2018-11-29 18:31:38

标签: python-3.x recursion

我在这里找到:exponential sum using recursion.python

完全相同的问题,但要实现的条件相同。

简要说明:我们已经开始研究递归,并且遇到了一些仅使用递归而不循环的问题。

因此,我们被要求编写一个计算指数和的函数。

这是我的尝试:

def exp_n_x(n, x):

    if n <= 0:
        return 1
    return (x/n)*exp_n_x(n-1, x)

它实际上仅计算第n个,而没有将其他n相加为i = 0。

我试图使函数对每个指数元素求和,这样:

def exp_n_x(n, x):

    if n <= 0:
        return 1
    sum = (x/n)*exp_n_x(n-1, x)
    n = n - 1
    return sum + (x/n)*exp_n_x(n-1, x)

但这对我没有帮助... 谢谢。

3 个答案:

答案 0 :(得分:0)

您在第一个函数中已经很接近解决方案,但是您遗漏了两个关键事项:您需要将x提高到n的幂,然后将其除以n! (n阶乘)。阶乘函数是从1n的所有整数的乘积,特殊情况下0!1。另外,您需要某个总和时就在创建产品。将这些放在一起就可以了:

def factorial(n):
    if n < 2:
        return 1
    return n * factorial(n - 1)


def exp_n_x(n, x):
    if n < 1:
        return 1
    return x ** n / factorial(n) + exp_n_x(n - 1, x)

答案 1 :(得分:0)

我认为您的问题是,您正在计算的总和具有可以从先前的总和中计算出来的项,但是(据我所知)却不能从先前的总和中计算出。因此,您可能需要对代码使用两个单独的递归部分。一个根据前一项计算下一项的值,然后将新项加到前一个总和上。

def term(n, x):
    if n <= 0:
        return 1
    return x / n * term(n-1, x)

def exp_sum(n, x):
    if n <= 0:
        return 1
    return exp_sum(n-1, x) + term(n, x)

这效率低下,因为要反复计算较小的n值的项。但这对于了解递归可能是可以的(我希望您会最终通过记忆或动态编程来了解避免此问题的方法。)

请注意,您可以将这两个函数组合为一个,只要您不介意更改函数签名并从递归中一次返回两个值(在元组中)。您可以添加非递归辅助函数,以使面向用户的功能按预期工作:

def exp_sum_recursive(n, x):            # this function returns term, sum tuples
    if n <= 0:
        return 1, 1
    term, sum = exp_sum_recursive(n-1, x)
    term *= x / n                       # each new term is based off of the previous term
    return term, sum + term             # the new sum adds the new term to the old sum

def exp_sum(n, x):                      # this is a non-recursive helper function
    return exp_sum_recursive(n, x)[1]   # it only returns the sum from the recursive version

答案 2 :(得分:0)

既然您已经使用./scriptB.sh -A "123 ABC street" -CN "John Smith" -O "5678" 实现了递归,那么当Python已经为我们提供了递归exp_n_x()时,为什么要在混合中抛出效率低下的递归factorial()

from math import factorial

def exp_n_x(n, x):
    return 1 if n < 1 else x ** n / factorial(n) + exp_n_x(n - 1, x)