2011-09-07 2 views
2

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

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.

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

+0

Почему вы не должны 'return' в каждой альтернативе' if'? –

ответ

5

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

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) 
+1

Отлично! Спасибо! Можете ли вы объяснить, почему это так? (Например, почему функция печати работает, пока оператор возврата не будет?) –

+0

«Почему функция печати работает, пока оператор возврата не будет»? Какие? Print-- как в show output - не имеет ничего общего с возвратом полезного значения из рекурсивной функции. Что ты спрашиваешь? Вы должны - возможно - искать вопросы по рекурсии. Если ни один из этих вопросов не является адекватным, возможно, вам придется открыть новый вопрос. –

+0

Прошу прощения, если вы неправильно поняли мой вопрос. Позвольте мне перефразировать его: почему исключение второго «возврата» влияет на мою способность возвращать словарь, но не моя способность печатать то же самое? Я бы понял, если исключение отрицает мою способность рекурсировать вообще, но функция явно рекурсировала без нее, что позволило печатать для вывода правильного результата. Я уверен, что чего-то не хватает, но рекурсия - это широкая тема, и я просто ищу руководство в дальнейших исследованиях. –

Смежные вопросы