我正在努力完成一个数学问题,该问题使用Python中的牛顿的guess和check方法来近似数字的平方根。用户应该输入一个数字,对该数字的初始猜测,以及他们想返回多少次才能检查答案。为了使事情变得更容易并了解Python(几个月前我才刚刚开始学习该语言),我将其分解为许多较小的函数。现在的问题是,我在调用每个函数并传递数字时遇到了麻烦。
这是我的代码,提供注释以帮助您(每个功能按使用顺序排列):
# This program approximates the square root of a number (entered by the user) # using Newton's method (guess-and-check). I started with one long function, # but after research, have attempted to apply smaller functions on top of each # other. # * NEED TO: call functions properly; implement a counting loop so the # goodGuess function can only be accessed the certain # of times the user # specifies. Even if the - .001 range isn't reached, it should return. # sqrtNewt is basically the main, which initiates user input. def sqrtNewt(): # c equals a running count initiated at the beginning of the program, to # use variable count. print("This will approximate the square root of a number, using a guess-and-check process.") x = eval(input("Please type in a positive number to find the square root of: ")) guess = eval(input("Please type in a guess for the square root of the number you entered: ")) count = eval(input("Please enter how many times would you like this program to improve your initial guess: ")) avg = average(guess, x) g, avg = improveG(guess, x) final = goodGuess(avg, x) guess = square_root(guess, x, count) compare(guess, x) # Average function is called; is the first step that gives an initial average, # which implements through smaller layers of simple functions stacked on each # other. def average(guess, x) : return ((guess + x) / 2) # An improvement function which builds upon the original average function. def improveG(guess, x) : return average(guess, x/guess) # A function which determines if the difference between guess X guess minus the # original number results in an absolute vale less than 0.001. Not taking # absolute values (like if guess times guess was greater than x) might result # in errors from math import * def goodGuess(avg, x) : num = abs(avg * avg - x) return (num < 0.001) # A function that, if not satisfied, continues to "tap" other functions for # better guess outputs. i.e. as long as the guess is not good enough, keep # improving the guess. def square_root(guess, x, count) : while(not goodGuess(avg, x)): c = 0 c = c + 1 if (c < count): guess = improveG(guess, x) elif (c == count): return guess else : pass # Function is used to check the difference between guess and the sqrt method # applied to the user input. import math def compare(guess, x): diff = math.sqrt(x) - guess print("The following is the difference between the approximation") print("and the Math.sqrt method, not rounded:", diff) sqrtNewt()
当前,我收到此错误:g, avg = improveG(guess, x) TypeError: 'float' object is not iterable. final函数使用猜测的最终迭代从数学平方根方法中减去,并返回总差。我什至这样做对吗?如果可以的话,可以提供建议的工作代码,并提供建议。同样,我是新手,因此对误解或明显的盲目的错误表示歉意。
g, avg = improveG(guess, x) TypeError: 'float' object is not iterable.
牛顿法的实现:
在需要时对其进行少量调整应该很容易。尝试一下,告诉我们什么时候遇到困难。
from math import * def average(a, b): return (a + b) / 2.0 def improve(guess, x): return average(guess, x/guess) def good_enough(guess, x): d = abs(guess*guess - x) return (d < 0.001) def square_root(guess, x): while(not good_enough(guess, x)): guess = improve(guess, x) return guess def my_sqrt(x): r = square_root(1, x) return r >>> my_sqrt(16) 4.0000006366929393
注意:您将在SO或谷歌搜索(BUT)上找到有关如何使用原始输入的足够实例,如果您要计算循环,循环c=0必须在循环之外,否则您将陷入无限循环。
c=0
Quiqk又脏又脏,有很多改善方法:
from math import * def average(a, b): return (a + b) / 2.0 def improve(guess, x): return average(guess, x/guess) def square_root(guess, x, c): guesscount=0 while guesscount < c : guesscount+=1 guess = improve(guess, x) return guess def my_sqrt(x,c): r = square_root(1, x, c) return r number=int(raw_input('Enter a positive number')) i_guess=int(raw_input('Enter an initial guess')) times=int(raw_input('How many times would you like this program to improve your initial guess:')) answer=my_sqrt(number,times) print 'sqrt is approximately ' + str(answer) print 'difference between your guess and sqrt is ' + str(abs(i_guess-answer))