2015-11-18 9 views
4

Я думаю, что ниже двух результатов функции будут такими же, но это не так.Условный оператор Python 'if else' не равен 'и или'

def fib2(n): 
    return n and n < 2 or fib2(n-1) + fib2(n-2) 

def fib3(m): 
    return m if m < 2 else fib3(m-1) + fib3(m-2) 

Когда значение аргумента 4, выход fib2 составляет 7, выход fib3 является 3. Почему такая ситуация происходит? Я не знаю об этом.
Мой Python версии 2.7.9 и ОС OSX 10.11.1

+0

Ваша первая функция эквивалентна: '(n и n <2) или fib2 (n-1) + fib2 (n-2)' –

+0

Вы можете попробовать отладку без использования тройного оператора и использовать визуальный отладчик, например : http://www.pythontutor.com/visualize.html#mode=edit –

+0

Ответ: http://stackoverflow.com/a/394887/2301450. Или, может быть, http://stackoverflow.com/a/10314837/2301450 – vaultah

ответ

1

Я пытался быть более многословным и написать свои функции, как это:

def fib2(n): 
    ret = n and n < 2 or fib2(n-1) + fib2(n-2) 
    print "fib2({}) = {}".format(n, ret) 
    return ret 

print fib2(4) 

def fib3(m): 
    ret = m if m < 2 else fib3(m-1) + fib3(m-2) 
    print "fib3({}) = {}".format(m, ret) 
    return ret 

print fib3(4) 

Оказывается, что fib2 пытается добавить логические значения номера, и именно поэтому это неверно. fib3 обрабатывает только цифры и является правильным. Но обратите внимание, что это не рекомендуемый способ вычисления чисел Фибоначчи! Если вы попробуете fib3 (1000), он будет работать бесконечно. Лучше начинать с 0 и 1 вверх, а не использовать рекурсию для вычисления чисел Фибоначчи.

я написал короткую функцию, которая вычисляет число Фибоначчи #n для вас:

def fib4(n): 
    a = 0 
    b = 1 
    for i in range(1, n + 1): 
     a, b = (b, a + b) 
    return a 

print fib4(0) 
print fib4(1) 
print fib4(2) 
print fib4(3) 
print fib4(4) 
print fib4(1000) 

Обратите внимание, что также работает на n==1000.

+0

Проблема на самом деле заключается только в том, что для 'n = 2' это' 0 и 0 <2 или fib2 (-1) + fib2 (-2) '. Поскольку '0' является ложным,' (0 и 0 <2) == 0', поэтому результат равен 0 или fib2 (-1) + fib2 (-2) '. Поскольку '0' по-прежнему является ложным, результатом является' fib2 (-1) + fib2 (-2) '. – poke

+0

@poke Запустите эту программу, и вы увидите, что 'fib2 (1)' is True, а также 'fib2 (-1)' и 'fib2 (-2)'. Все остальные числа произвольны, потому что они являются результатом добавления True с целым числом. Они не имеют никакого смысла. Но, конечно, вы можете определить такую ​​функцию, если она имеет смысл для вас! Или, действительно, кажется, что True равно 1, поэтому 'fib2 (n)' на самом деле 'fib3 (n + 2)' (потому что 'True + True' равно 2 и' True + 2' равно 3. – Uri

+0

Да, я знаете, но вы можете рассчитать с помощью 'True'. Это' 1'! (Знайте, что 'bool' на самом деле является подтипом' int') И 'fib2 (1)' должно быть '1', поэтому он дает' True' фактически «* приемлемый» * результат. Реальная проблема заключается в том, что он ломается для 'n = 0' (туманный в комментарии выше), что вызывает большие проблемы. Если он работал на' 0', вы не заметили бы странный результат 'True' для' fib2 (1) ', если вы не просили точно« fib2 (1) ». (Кстати, это не была критика вашего ответа - ваш ответ просто прекрасен - это было просто некоторые Дополнительная информация) – poke