Хвостовая рекурсивная функция не может вернуть значение (Python 3) - PullRequest
2 голосов
/ 08 сентября 2011

Я создал хвостовую рекурсивную функцию для решения задачи оптимизации:

def optimize(current_price = 0.1, last_profit = 0.0):
    current_profit = profit(current_price)
    if (last_profit > current_profit) and (current_profit > 0.0):
        return {'best_price': current_price - 0.1, 'best_profit': last_profit}
        # print({'best_price': current_price - 0.1, 'best_profit': last_profit})
    else:
        optimize(current_price + 0.1, current_profit)

def best_price():
    optimized = optimize() # optimize() should return a dict, 
                           # allowing optimized['best_price'] 
                           # and optimized['best_profit'] to be called
    print("Pricing the tickets at ${0} will produce the greatest profit, ${1}.".format(optimized['best_price'], optimized['best_profit']))

Функция работает правильно, за исключением того, что она ничего не возвращает.Я не хочу сказать, что первый оператор if никогда не вызывается (фактически, когда я раскомментирую строку печати, он напечатает правильный результат), но оператор return не может вернуть словарь.

Это приводит к TypeError, когда я пытаюсь вызвать optimized['best_price'], как 'NoneType' object is not subscriptable.

Я уже некоторое время работаю над этой ошибкой и, похоже, не могуон работает сам или найди что-нибудь об этом в Интернете.На данный момент я просто хочу узнать решение.Есть идеи?Спасибо!

1 Ответ

5 голосов
/ 08 сентября 2011

Даже хвостовой рекурсивной функции требуется return в Python:

def optimize(current_price = 0.1, last_profit = 0.0):
    current_profit = profit(current_price)
    if (last_profit > current_profit) and (current_profit > 0.0):
        return {'best_price': current_price - 0.1, 'best_profit': last_profit}
    else: # Add return below here
        return optimize(current_price + 0.1, current_profit)
...