我在这里找到: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)
但这对我没有帮助... 谢谢。
答案 0 :(得分:0)
您在第一个函数中已经很接近解决方案,但是您遗漏了两个关键事项:您需要将x
提高到n
的幂,然后将其除以n!
(n阶乘)。阶乘函数是从1
到n
的所有整数的乘积,特殊情况下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)