为什么会出现RecursionError:超过最大递归深度?

时间:2019-02-22 16:45:14

标签: python recursion

这是代码:

def isEven (n):    #function checks if the number is even or odd

    if (int(n)%2) == 0:
        True
    else:
        False


def Edit(b,x,y): #function loops through the number
   m = str(b)
   for i in range(1, len(m)+1):
        if isEven(m[-i]):
            continue
        elif int(m[-i+(len(m))]) > 5:
            b = b + 1
        else:
            b = b - 1
        y = y + 1
        x = x + 1
   Edit(b,x,y)

number = input()
Number = int(number)
caseNum = 0
moves = 0

Edit(Number,caseNum,moves)

print('Case #' + str(caseNum) + ' : ' + str(moves))

我想创建一个代码来检查数字中是否有奇数位,并递增或递减该数字,直到该数字中没有奇数位为止。

2 个答案:

答案 0 :(得分:0)

我不清楚您期望得到什么输出,因此假设您要在数字(4567-> 4468)中不输入没有奇数位

您只需执行以下操作即可

n = [int(i) for i in input("Enter a number: ")]
caseNum = 0

for i, x in enumerate(n):
    if x % 2 != 0:
        if x > 5:
            n[i] += 1
        else:
            n[i] -= 1
        caseNum += 1

print("".join(str(x) for x in n), "CaseNum: ", caseNum)

如果您已经在主程序中使用了if-else,则实际上并不需要偶函数。

从代码开始,如果您使用的是Even函数,则需要返回一个值TrueFalse

 def isEven (n):    #function checks if the number is even or odd
    if int(n) % 2 == 0:
        return True
    else:
        return False

您在调用同一函数(循环执行该函数)时没有任何停止条件,就得到了RecursionError

 Edit(b,x,y)

此函数中的该语句正在产生问题,经过限制后,python停止执行并显示错误。

如果您可以详细说明caseNum和移动的用法,我可以将它们添加到程序中。

答案 1 :(得分:0)

即使没有作为最后一步无条件调用Edit(b,x,y)的情况,您的代码仍将朝着“超出最大递归深度”的方向前进。

问题是您要根据数字增加或减少数字。考虑一个像3000这样的数字,它有一个高阶奇数位。您需要在1000个递归调用中将其递增或递减近1000倍。但是默认的堆栈深度只有1000帧,因此您已经沉没了。

但是情况变得更糟。考虑一个简单的数字,例如10,您的减量和增量逻辑会将其更改为9,然后又更改为10,然后是9,然后是10,依此类推。

最好像@DeepMehta那样增加和减少单个数字,而不是整个数字。

要正确控制对Edit()的递归调用,请使用x和/或y计数器来确定在此调用期间是否进行了任何更改。如果没有更改,请返回该数字。如果有更改,请递归以完成工作。

isEven()函数而言,您只需执行以下操作即可:

def isEven(number):
    ''' function checks if the number is even or odd '''

    return int(number) % 2 == 0