创建的函数不';t工作(Python)
我对python相当陌生,我试图用它来制作一个程序来计算Stern Brocot序列的第n项(你可以查一下,这就是为什么我的函数被称为SBSeq)。由于某些原因,它将无法工作,并且会出现错误,例如:创建的函数不';t工作(Python),python,math,modular-arithmetic,ceil,Python,Math,Modular Arithmetic,Ceil,我对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
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))
任何帮助都将不胜感激 假设缩进问题不是一个真正的问题,问题是当递归进行时,您的数字可以达到
1
以下,然后一旦达到1
以下(即n达到0
),它将继续递归调用SBSeq而不退出
如果nSBSeq(2)
调用SBSeq(0)
,SBSeq(0)
调用SBSeq(-1)
,以及SBSeq(-1)
永远调用SBSeq(-1)
,则递归函数开始时的条件应为
只需在调试器中为SBSeq(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))
导入数学
从数学导入单元
def SBSeq(n):
如果n,下面问题的OP与您的问题相同。请检查:您的代码甚至无法编译。请发布一些有效的代码。我猜函数是用负输入调用的,对于负输入,没有提前退出条件,ceil(n/2)-1
看起来可疑。请注意,0*某些函数()
不会对0短路。@Borja我确实检查过了,它没有和我一样的问题。我正在序列中生成一个特定的术语,而他/她正在生成一个列表。@juanchopanza它确实可以编译(无论如何,在Python 2.7.9中)。我没有把版本放进去。。。很抱歉
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))