2017-01-28 9 views
-1

Все правильно, но что происходит в моем цикле while. Я пытаюсь написать эту функцию рекурсивно, и это то, что я придумал.Пока цикл не повторяется

def fp(f, guess, error=0.0000000000001): 
    p_guess = guess 
    c_guess = f(p_guess) 
    iterations = 0 
    while not close(p_guess, c_guess, error=error): 
     next = f(guess) 
     iterations += 1 
     return fp(f, next, error=error) 
    return (iterations, c_guess) 

def fp_sqrt(x): 
    return fp(lambda y: (y + x/y)/2, 1.0) 

Я знаю, что у меня что-то не хватает. Кто-то сказал, чтобы я взял выражение возврата из области действия из цикла while, но это просто закончило бесконечный цикл.

Из оболочки:

fp_sqrt (2)

Ожидаемые результаты: (5, 1,414213562373095)

Мой выход: (0 , 1.41421356237309 5) Таким образом, переменная не увеличивается, чтобы показать, сколько итераций я прошел в цикле.

+0

Если я выберу это из области действия, разве у меня не будет двух операторов возврата? разве это не проблема? –

+1

Код кажется несколько смущенным. Либо сделайте что-нибудь рекурсивное, либо используйте цикл. Не пытайтесь использовать оба. Если рекурсивный, это должны быть вызовы функций, которые вы пытаетесь подсчитать, а не итерации цикла. –

+0

Извините, что задание хочет просто отредактировать код внутри цикла while и ничего не изменить. это то, что я придумал, но да ... есть ли лучший способ сделать то, что я пытаюсь сделать? –

ответ

0

Вы не должны решить эту проблему с помощью рекурсии, но только итерации и переназначения результатов обратно к переменному циклу, например:

while not close(p_guess, c_guess, error=error): 
    p_guess, c_guess = c_guess, f(c_guess) 
    iterations += 1 
return iterations, c_guess 

#fp_sqrt(2) -> (5, 1.414213562373095) 

Примечание: next является встроенным и вы не должны использовать его в качестве переменного имя

Вы могли бы сделать это рекурсивный, но это делает while просто многословный if заявление:

while not close(p_guess, c_guess, error=error): # if would suffice 
    iterations, result = fp(f, c_guess, error=error) 
    return iterations+1, result 
return (0, c_guess) 

#fp_sqrt(2) -> (5, 1.414213562373095) 
+0

спасибо, другие функции, которые я сделал, были сделаны рекурсией, поэтому я думаю, что мой ум был чрезмерным. –

+0

Я относительно новичок в python, и я никогда не видел ничего подобного в одной строке. это еще один способ сказать p_guess = c_guess & c_guess = f (c_guess)? –

+0

Да эквивалентно двум строкам: 'p_guess = c_guess; c_guess = f (c_guess) '. Это стандартное назначение кортежа и распаковка и обычно используемое, например. swapping - это 'a, b = b, a', что позволяет избежать временной привязки. – AChampion

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