在Python中使用累积递归生成给定方程的结果

在Python中使用累积递归生成给定方程的结果,python,accumulator,Python,Accumulator,给定的方程式为: 我尝试了以下方法: def eqn_result (n): return eqn_result_acc(n,2) def eqn_result_acc(current_n, sum_so_far): if current_n==1: return sum_so_far else: next_p = sum_so_far * current_n next_s = sum_so_far + current_

给定的方程式为:

我尝试了以下方法:

def eqn_result (n):
    return eqn_result_acc(n,2)

def eqn_result_acc(current_n, sum_so_far):
    if current_n==1:
        return sum_so_far
    else:
        next_p = sum_so_far * current_n
        next_s = sum_so_far + current_n
        return eqn_result_acc(current_n-1, sum_so_far+(next_p/next_s))

任何帮助都很好

你得到了什么结果?你期待什么?有什么错误吗

你是不是被整数除法吊起来了?第二项是
3/2=1.5
。您使用的是所有整数。你需要把它们变成浮点数

这应该行得通:

import operator

def foo(n):
    if n == 0:
        return 1

    l = range(1, n + 1)

    top = sum(l)
    bottom = reduce(operator.mul, l, 1)
    return foo(n - 1) + float(top) / float(bottom)
现在,如果你想累积结果,你需要存储成瘾和产品,比如:

def foo(step, n, r, s, p):
    if n == step:
        return r

    s += step + 1
    p *= step + 1
    r += float(s) / float(p)

    return foo(step + 1, n, r, s, p)

def bar(n):
    return foo(0, n, 1, 0, 1)
只是为了好玩,这里有第三个版本,它在某种程度上更有意义,但它是非累积的,因为它首先计算总和和乘积,然后在每一步减少它们:

def foo(n, s, p):
    if n == 0:
        return 1

    return float(s) / float(p) + foo(n - 1, s - n, p / n)

def bar(n):
    l = range(1, n + 1)
    s = sum(l)
    p = 1
    for e in l: p *= e

    return foo(n, s, p)

你得到了什么结果?你期待什么?什么错误,如果有的话?当n=3时,我期望4.5,结果是4参见我的答案。我刚刚意识到这是你的问题。或者来自未来导入部门的
。由于我没有从未来导入部门学习
,我无法使用它。那么我的节目需要投哪一部分呢?我有点困惑,因为我是python新手。请看float()来转换它。我理解这个方法,但我还不允许使用导入运算符。有没有其他方法来更正我的代码?哦,是的。。。对不起,
import
在我的第二个示例中是无用的,在我的第一个示例中,它只用于对列表中的所有元素进行乘法,可以不用它来编写。我尝试了你的方法,得到了错误
预期为4.5,当n=3
时看到了3.83333。哎哟。。。的确我的累积版本是错误的,现在已经修复:)好吧。。。这是一个递归函数,所以这是预期的,您要计算哪一步?