Python RecursionError:比较中超过了最大递归深度-sys.setrecursionlimit(1500)

Python RecursionError:比较中超过了最大递归深度-sys.setrecursionlimit(1500),python,recursion,recursionerror,Python,Recursion,Recursionerror,我正在使用递归进行Python练习。 目标是请求用户要研究的最大值,并测试从1到该最大值的所有值。算法总是达到1或4。当达到这些值时,程序停止,然后返回其中一个值 我想在这里使用递归方法,但最大递归深度有一个问题 该程序仅适用于数字1和2: C:\Users\Mathieu\Desktop λ python algo.py Enter a number > 0 1 vect1 = [1] vect4 = [] C:\Users\Mathieu\Desktop λ python alg

我正在使用递归进行Python练习。 目标是请求用户要研究的最大值,并测试从1到该最大值的所有值。算法总是达到1或4。当达到这些值时,程序停止,然后返回其中一个值

我想在这里使用递归方法,但最大递归深度有一个问题

该程序仅适用于数字1和2:

C:\Users\Mathieu\Desktop
λ python algo.py
Enter a number > 0 1
vect1 =  [1]
vect4 =  []

C:\Users\Mathieu\Desktop
λ python algo.py
Enter a number > 0 2
vect1 =  [1]
vect4 =  [2]
我提出了一些建议,要求将最大递归深度扩展到1500,但仍然不起作用

[上一行重复996次以上]

RecursionError:比较中超出了最大递归深度

我也尝试过迭代方法,但我有一个问题:

  def recursive(s, n):
        while n != 0:
            s = s + (n % 10)**2
            n = n // 10
        if s == 1 or s == 4:
            return s
        else:
            return recursive(s, n)
你有什么建议或建议吗?先谢谢你

import sys
sys.setrecursionlimit(1500)

class Error(Exception):
    """ Base class for exceptions """
    pass

class StrictlypPositive(Error):
    """ Called when the number is lower than 1 """
    pass

def recursive(s, n):
    if s == 1 or s == 4:
        return s
    else:
        s = s + (n % 10)**2
        n = n // 10
        return recursive(s, n)

vect1 = []
vect4 = []

while True:
    try:
        maxVal = int(input("Enter a number > 0 ").strip('n'))
        if maxVal < 1:
            raise StrictlypPositive
        break
    except ValueError:
        print("Enter a number")
    except StrictlypPositive:
        print("Enter a number strictly positive")

for val in range(1, maxVal + 1):
    theSum = 0
    theSum = recursive(theSum, val)
    if theSum == 1:
        vect1.append(val)
    else:
        vect4.append(val)

print("vect1 = ", vect1)
print("vect4 = ", vect4)
导入系统 系统设置递归限制(1500) 类错误(异常): “”“异常的基类”“” 通过 类严格相反(错误): “”“当号码小于1时调用”“” 通过 def递归(s,n): 如果s==1或s==4: 返回s 其他: s=s+(n%10)**2 n=n//10 返回递归(s,n) vect1=[] vect4=[] 尽管如此: 尝试: maxVal=int(输入(“输入一个大于0的数字”).strip('n')) 如果maxVal<1: 提出严格的反对意见 打破 除值错误外: 打印(“输入数字”) 除了严格的对立: 打印(“输入一个严格为正数的数字”) 对于范围(1,最大值+1)内的val: theSum=0 theSum=递归(theSum,val) 如果theSum==1: vect1.append(val) 其他: vect4.append(val) 打印(“vect1=”,vect1) 打印(“vect4=”,vect4)
在递归函数中添加一个简单的
打印
,会显示一个无休止的循环

Enter a number > 0: 3
recurse: s 1, n 0
recurse: s 4, n 0
recurse: s 9, n 0
recurse: s 9, n 0
recurse: s 9, n 0
recurse: s 9, n 0
recurse: s 9, n 0
recurse: s 9, n 0
recurse: s 9, n 0
recurse: s 9, n 0
目前还不清楚计算应该正确地产生什么,但是当新值与旧值相同时,让它不递归至少可以避免直接症状


在一般情况下,当代码没有达到预期效果时,在您认为错误的地方添加一个
打印
,然后查看它的效果。

简而言之,即使将递归限制设置为100万,错误仍然会发生。通过将
n
设置为
3
,可以观察到这一点,例如,第一个循环将成功,但此后将无限循环,因为
n
已变为
0
3//10
)。非常感谢您,事实上,在n!=0更重要的是,不需要为异常声明基类,也不需要在立即为其指定另一个值时将0指定给sum。我已回滚您的编辑。请不要移动球门柱。接受你得到的答案(或者发布你自己的答案并接受),然后就你的新问题问一个新问题。可能这次别忘了解释函数实际应该做什么。编辑已经回滚,但对答案的反应在这里解释: