You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归函数返回None问题求助:递归调用未正确返回值

递归Switch函数返回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

问题原因与解决方案

问题根源

  1. 当case == 1时,递归调用switch(valor)但没有返回这个递归调用的结果,导致上层switch函数无法接收最终递归返回的valor,最终默认返回None。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:10:50