-1

我对python相当陌生,我试图用它来制作一个程序来找出Stern-Brocot序列的第n项(你可以查一下,这就是我的函数被称为SBSeq的原因)。由于某种原因,它不起作用,并且会出现错误,如下所示:

File "C:/Python27/Factorials.py", line 6, in SBSeq
return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2))

最终到了这个:

File "C:/Python27/Factorials.py", line 5, in SBSeq
if n == 1: return 1
RuntimeError: maximum recursion depth exceeded in cmp

这是原始代码。

import math
from math import ceil

def SBSeq(n):

if n == 1: return 1
return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2))

任何帮助,将不胜感激!

4

3 回答 3

2

假设缩进问题不是真正的问题,问题是您的数字1在递归时可以达到以下,然后一旦达到以下1(即 n 到达0),它会继续递归调用 SBSeq 而不会退出。

递归函数开始的条件应该是if n <= 1 : return 1.

代码 -

def SBSeq(n):
    if n <= 1: return 1
    return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2))
于 2015-07-03T07:10:43.663 回答
1

SBSeq(2)电话SBSeq(0)SBSeq(0)电话SBSeq(-1),和永远的SBSeq(-1)电话。SBSeq(-1)

只需为SBSeq(0).

于 2015-07-03T07:11:08.073 回答
0

从调试器中,你可以发现SBSeq(2)调用SBSeq(0),然后无限调用SBSeq(-1)。该函数也必须在n小于或等于 1 时终止。

这是改进的功能:

import math
from math import ceil

def SBSeq(n):
    if n <= 1: return 1 # not n == 1
    return ((n%2)*SBSeq(ceil(n/2)-1))+SBSeq(ceil(n/2))
于 2016-01-02T15:47:28.187 回答