Корневая аппроксимация корня Ньютона - но не вернет ли это значение? - PullRequest
0 голосов
/ 19 июня 2019

Поэтому я пытаюсь следовать лекциям SICP в Python и сконструировать простую модель черного ящика для ньютоновского метода нахождения аппроксимаций квадратного корня.

Кажется, что сам код работает нормально,но моя функция продолжает возвращать None?В приведенной ниже функции tryfor я сделал так, чтобы она одновременно печатала аппроксимацию и возвращала ее так, чтобы родительская функция могла возвращать аппроксимацию.

Я знаю по функции печати, что мой код может найти правильный ответ.Однако, когда я пишу print (NewtonSqrt (2)), None возвращается - мое приближение не было «возвращено» Смущен тем, почему это происходит.

def NewtonSqrt(x):

  def improve(guess):
    return (guess + (x/guess)) / 2

  def goodenough(guess):
    if abs(guess - (x/guess)) < 0.00001:
      return True

  def tryfor(guess):
    if goodenough(guess) == True:
      print(guess)
      return guess
    else:
      tryfor(improve(guess))

  return tryfor(1)

print(NewtonSqrt(2))

1 Ответ

0 голосов
/ 19 июня 2019

В коде есть две проблемы, кроме возможностей оптимизации.Во-первых, вы должны уважать типы переменных, если вы используете float.Используйте

return (guess + (x/guess)) / 2.

вместо

return (guess + (x/guess)) / 2

Второй - рекурсивность.Функция tryfor должна заканчиваться return:

  def NewtonSqrt(x):

      def improve(guess):
        return (guess + (x/guess)) / 2.

      def goodenough(guess):
        if abs(guess - (x/guess)) < 0.00001:
          return True

      def tryfor(guess):
        if goodenough(guess) == True:
          #print(guess)
          return guess
        else:
          return tryfor(improve(guess))

      return tryfor(1)

print(NewtonSqrt(2))

Теперь вывод будет отличаться от None.Я надеюсь, что вы найдете это полезным !!

...