Python函数中递归调用为何导致while循环重复触发输入
问题原因分析
你的问题出在递归调用的栈层级逻辑上:
- 当输入
f触发rec()递归调用时,原来的rec()函数的while循环并没有终止,只是暂停执行,等待新的递归调用结束。 - 当你在新的递归层输入
e,只是终止了当前层的run循环、退出这个新的rec()调用,但程序会回到上一层暂停的rec()函数的while循环中,继续执行下一轮循环——也就是再次弹出second number的输入提示,这就是你看到第三次输入的原因。
解决方案
方案1:递归调用后终止当前层循环
在触发递归后,直接终止当前函数的循环或退出函数,避免回到上一层的未完成循环:
def rec(): n1=None run=True while run: if n1 == None: n1=int(input('first number')) n2=int(input('second number')) out=n1+n2 i=input(f'{out} enter r f or e') if i=='e': run=False elif i=='r': n1=out elif i=='f': rec() run=False # 递归后终止当前层循环 rec()
或者更直接用return退出当前函数:
def rec(): n1=None run=True while run: if n1 == None: n1=int(input('first number')) n2=int(input('second number')) out=n1+n2 i=input(f'{out} enter r f or e') if i=='e': run=False elif i=='r': n1=out elif i=='f': rec() return # 直接退出当前函数,不再回到循环 rec()
方案2:放弃递归,直接重置变量(更简洁合理)
其实“重新开始”的逻辑完全不需要递归,直接重置n1为None即可,既避免了递归栈的层级问题,代码也更易维护:
def rec(): n1=None run=True while run: if n1 == None: n1=int(input('first number')) n2=int(input('second number')) out=n1+n2 i=input(f'{out} enter r f or e') if i=='e': run=False elif i=='r': n1=out elif i=='f': n1=None # 重置n1,下一轮循环会重新要求输入第一个数 rec()
内容的提问来源于stack exchange,提问作者AJ Kun War
相关产品推荐
相关产品推荐

