Python递归函数返回None问题求助:递归调用未正确返回值
问题描述
我是Python初学者,正在学习函数与递归(尚未接触类、OOP、包装器等内容)。我编写了一个基于用户输入触发递归的switch函数,递归过程可以正常执行,但最终变量返回值为None。测试用例:初始值100.00,两次选择选项1,每次增加100.00,预期最终值为300.00,但实际输出None。
代码展示
主文件代码
import funcoes_moeda def switch(valor): case = int(input('Escolha uma opcao... (0 para encerrar) : ')) if case == 1: valor = funcoes_moeda.aumentar(valor) print('Valor aumentado: {}'.format(valor)) switch(valor) elif case == 2: pass elif case == 3: pass elif case == 4: pass else: return valor valor = float(input('Insira o valor: ')) print("Escolha a funcao a ser aplicada no valor inserido: \n" \ "1 - Aumentar Valor \n" \ "2 - Diminuir Valor \n" \ "3 - Dobrar Valor \n" \ "4 - Dividir Valor \n" \ "0 - Encerrar o Prorama" ) valor = switch(valor) print('Funcao foi aplicada. O valor final ficou: {}'.format(valor))
导入的函数文件代码
def aumentar(valor): quantia_aumentada = float(input('Insira a quantidade que voce deseja acrescentar: ')) valor += quantia_aumentada return valor def diminuir(): pass def dobro(): pass def metade(): pass
执行结果
Insira o valor: 100.00
Escolha a funcao a ser aplicada no valor inserido:
1 - Aumentar Valor
2 - Diminuir Valor
3 - Dobrar Valor
4 - Dividir Valor
0 - Encerrar o Prorama
Escolha uma opcao... (0 para encerrar) : 1
Insira a quantidade que voce deseja acrescentar: 100.00
Valor aumentado: 200.0
Escolha uma opcao... (0 para encerrar) : 1
Insira a quantidade que voce deseja acrescentar: 100.00
Valor aumentado: 300.0
Escolha uma opcao... (0 para encerrar) : 0
Funcao foi aplicada. O valor final ficou: None
问题原因与解决方案
问题根源
- 当
case == 1时,递归调用switch(valor)但没有返回这个递归调用的结果,导致上层switch函数无法接收最终递归返回的valor,最终默认返回None。 case == 2/3/4分支仅用pass占位,没有处理递归或返回逻辑,执行后函数同样会默认返回None。
修改后的代码
调整switch函数,确保所有分支都正确返回递归调用的结果或最终值:
import funcoes_moeda def switch(valor): case = int(input('Escolha uma opcao... (0 para encerrar) : ')) if case == 1: valor = funcoes_moeda.aumentar(valor) print('Valor aumentado: {}'.format(valor)) # 递归调用后返回结果,让上层函数能拿到最终值 return switch(valor) elif case == 2: valor = funcoes_moeda.diminuir(valor) print('Valor diminuido: {}'.format(valor)) return switch(valor) elif case == 3: valor = funcoes_moeda.dobro(valor) print('Valor dobrado: {}'.format(valor)) return switch(valor) elif case == 4: valor = funcoes_moeda.metade(valor) print('Valor dividido pela metade: {}'.format(valor)) return switch(valor) else: return valor valor = float(input('Insira o valor: ')) print("Escolha a funcao a ser aplicada no valor inserido: \n" \ "1 - Aumentar Valor \n" \ "2 - Diminuir Valor \n" \ "3 - Dobrar Valor \n" \ "4 - Dividir Valor \n" \ "0 - Encerrar o Prorama" ) valor = switch(valor) print('Funcao foi aplicada. O valor final ficou: {}'.format(valor))
同时完善funcoes_moeda.py里的其他函数:
def aumentar(valor): quantia_aumentada = float(input('Insira a quantidade que voce deseja acrescentar: ')) valor += quantia_aumentada return valor def diminuir(valor): quantia_diminuida = float(input('Insira a quantidade que voce deseja diminuir: ')) valor -= quantia_diminuida return valor def dobro(valor): valor *= 2 return valor def metade(valor): valor /= 2 return valor
原理说明
递归函数的返回值需要逐层传递,每一次递归调用的结果都要返回给上层调用者,这样最外层的函数才能拿到最终的结果。如果某个分支没有显式返回值,Python函数会默认返回None,这就是问题的核心原因。
内容的提问来源于stack exchange,提问作者Raul Chiarella

