Python 在数列上使用递归?

Python 在数列上使用递归?,python,math,recursion,Python,Math,Recursion,我想在连续分数上使用递归,如下所示 用户将输入一个值n,如果n为3,则将如下所示: 2+1/(1+1/(2+2/(3+3/4))) 如果方程中的前2+1/是固定的,现在我们必须计算它后面的数字。这就是我几天来一直在挠头的地方。有人教我可以使用递归来计算那个部分,但我一直在尝试学习如何使用它,但我的只是永远循环或者有递归错误 n = int(input("Enter n value: ")) result = 0 fract = 0 def frac(j): global fract

我想在连续分数上使用递归,如下所示

用户将输入一个值n,如果n为3,则将如下所示:

2+1/(1+1/(2+2/(3+3/4)))

如果方程中的前2+1/是固定的,现在我们必须计算它后面的数字。这就是我几天来一直在挠头的地方。有人教我可以使用递归来计算那个部分,但我一直在尝试学习如何使用它,但我的只是永远循环或者有递归错误

n = int(input("Enter n value: "))
result = 0
fract = 0

def frac(j):
    global fract
    for i in range(j):
        fract = (j + j)/ frac(j)
    return fract

def calc_e():
    e = 2 + 1/ frac(n) / n + 1
    return e

print(calc_e())

#formula = 2 + 1 / (1 + 1 / (2 + 2 / (3 + 3 / (4 + 4 / (...)))))

TLDR:我不知道如何计算2+1后的零件/

您可以使用简单的递归:

#2 + 1/ (1 + 1 / (2 + 2/ (3 + 3 / 4)))
def get_equation(_to_val, string_rep = False):
   if string_rep:
     def calculate(start, end):
       return '{}+{}/({})'.format(start, start, calculate(start+1, end) if start < end else end+1)
     return '2+1/({})'.format(calculate(1, _to_val))
   def calculate(start, end):
      return start+start/(calculate(start+1, end) if start < end else end+1)
   return calculate(1, _to_val)


print(get_equation(3))
print(get_equation(3, True))

您的
frac
例程中有一些基本问题

def frac(j):
    global fract
    for i in range(j):
        fract = (j + j)/ frac(j)
    return fract
  • 您还没有决定如何传达结果:您不断更新全局
    fract
    ,但随后返回其值。应该只需要其中一个
  • 类似地,您正在使用
    for
    循环和递归逐步完成连分数。您应该只使用其中一个
  • 您没有递归的基本情况:没有任何东西可以告诉算法它已经“触底”。每次进入计算步骤时,都会在
    frac
    上重复出现;没有不重复的逻辑路径。这是获得无限递归的主要原因。如果这些对你来说是新概念,请学习递归教程;这至少可以解释得和我们这里所能解释的一样好
  • 你的代数是错误的:
    (j+j)/frac(j)
    是错误的运算顺序,只给你
    2*j/frac(j)
    。您应该有类似于
    j+j/frac(j+1)
    的内容

这些提示足以让您进行更有用的编码实践吗?您可能还需要调试帮助;一些精心挑选的
print
语句通常会告诉您发生了什么。查看此可爱的博客以获取帮助。

无需使用
全局变量;我也看不出哪里需要
for
-循环。正如前面的答案所指出的,你有一些代数错误

您应该在
frac
中添加一个停止条件参数,以阻止它无限递归。如果点击此按钮,则返回值
j

# max number of terms n
def frac(j, n):
    if j >= n: return n
    return j + j / frac(j+1, n)

# remember to pass 1.0 instead of 1, or cast to float in frac
# to avoid integer division which will truncate all fractions
def calc_e(n=100):
    return 2 + 1 / frac(1.0, n)
这将返回:

n    calc_e(n)
----------------------
2    2.666666666666667
4    2.716981132075472
8    2.718281657666404
16   2.718281828459045
32   2.718281828459046
64   2.718281828459046
128  2.718281828459046
256  2.718281828459046
512  2.718281828459046

由于堆栈溢出,无法进行更多的递归。

这里有一个提示:您尝试递归的基本函数是什么?在我看来,这似乎是
n+n/(n+1)
。您的代码运行正确,请查看是否可以修复它。如果你仍然坚持,我(或其他人)会很高兴为你指出正确的方向。是的,我已经坚持了。我试着用我能想到的任何方式改变函数。我已将其更改为(j+j)/fract(j),用if语句替换for循环,并尝试使用临时变量使其开始从1除。所有给出的错误或错误答案都对你有帮助吗?是的,这里的答案真的很有帮助!我从学校只学到了大约20分钟的递归知识,这篇文章帮助我尝试在函数frac(j)中修改代码,但不知何故仍然无法让它工作。我用if语句替换了for循环,并修复了代数。但是现在我不知道什么时候在递归中返回值,也不知道如何让j从1开始?很好:你已经确定了你的弱点所在。搜索这些短语,并至少完成每个主题的一个教程:循环、函数和递归。通过完整的教程,每一个都会更好地理解;这一级别的广泛帮助与堆栈溢出无关。啊,现在我的导师教我的代码看起来很熟悉了。虽然现在你在S/O上发布了完整的解决方案,但由于剽窃,我不能再使用它了。lol。谢谢,尽管这有助于我理解递归better@bluelighty啊,是的,关于这个。。。您可以实现我的另一个建议,即强制转换为
float
,而不是通过1.0(请参见代码注释),作为规避剽窃检查的一种方式
n    calc_e(n)
----------------------
2    2.666666666666667
4    2.716981132075472
8    2.718281657666404
16   2.718281828459045
32   2.718281828459046
64   2.718281828459046
128  2.718281828459046
256  2.718281828459046
512  2.718281828459046