为什么这个平方根近似不起作用?该程序基本上是找到给定数字的平方根的近似值。我不明白为什么它不起作用的问题。该程序正在编译但从未运行。它无限地计算一些东西。publicstaticvoidMain(string[]args){Console.WriteLine("输入数字求平方根");varnum=Convert.ToInt32(Console.ReadLine());varans=SqaureRoot(num);Console.WriteLine("{0}的平方根:{1}",num,ans);问题显然必须出在这个方法中,在我看来代码并没有从while循环中退出,我只是不明白为什么。这个问题必须用NewtonRaphson的方法来解决,它只接近于平方根。会不会是因为牛顿拉夫森方程没有括号?publicstaticdoubleSqaureRoot(doublea){if(a<0)thrownewException("Cannotsqrtanegativenumber");双重错误=0.00001;双x=1;while(true){doubleval=x*x;如果(Math.Abs??(a)<=错误)返回x;x=x/2+a/(2*x);我不明白为什么它不起作用的问题。...代码没有从while循环中退出,我只是不明白为什么。是真的,你看不到。我一直在看冰箱里的牛奶,但我看不到牛奶。你有冰箱盲症,但编码。你正直视一个明显的缺陷,但你看不到它。这个问题在初学者和有经验的程序员中都很常见。它在人类中也很常见。你倾向于阅读你的想法,即使它不是:“我爱春天的巴黎”,但这并不是它所说的。您正在分析的程序是一个有效程序,但该程序只存在于您的头脑中。你要分析你实际写的和实际运行的程序!这本质上是一种确认偏差——一种倾向于查看证明代码正确的证据,而不查看与之相矛盾的证据的倾向。经验丰富的开发人员每天都会使用许多技术来打破代码盲点和查找错误。您使用的技术是让具有新眼光的人来看待问题。这种技术有效;我只需要查看您的代码即可发现明显的问题,因为我正在阅读您编写的代码,而您正在阅读您认为自己编写的代码。但这是一种糟糕的技术,因为它浪费了其他人的时间来解决您可以学习解决的琐碎问题。今天是学习如何自己解决这些问题的好日子。第一项技术是学习如何使用调试器。您要做的是在调试器中单步调试代码,一次一个语句,并在每个语句上预测该语句将执行的操作。您必须在执行该语句之前进行推测。然后执行语句,看看你的预测是否成真。最终你会做出错误的预测,这就是你对程序的理解是错误的。这也适用于我们的视错觉。如果你告诉人们阅读一个词,暂停并阅读下一个词,很容易看出错误。下一个技术称为橡皮鸭调试。找一只橡皮鸭或一个研究生或其他可以交谈的东西,大声解释你程序的每一行——最好是在调试时——并对那一行是正确的给出一个过于详细的解释。到了一行你无法证明这一点,要么是你自己的程序不明白,要么是那行错了。你会觉得自己像个白痴,对着一只橡皮鸭大声说话,但让它发挥作用的部分方法是让你的大脑来说话。同样,这会影响我们的错觉:如果您阅读每个单词并大声说出句子,而不是阅读整个句子然后说出整个句子,错误就会变得很明显。特别要非常仔细地解释每个变量的用途和用法。仅在您的情况下会很快找到问题,因为您有一个声明并写入但从未读取过的变量。写入但从未读取的变量是一个巨大的危险信号;这意味着您的机器中要么有一个无用的部分,要么更可能的是,您有一个没有被滥用的关键部分。就像这里的情况一样。在您的特定情况下,有一些特殊的技术。SOLVER{VALIDATEARGUMENTINITIALIZEAPPROXIMATIONwhile(true){if(WITHINTOLERANCES)RETURNAPPROXIMATIONREFINEAPPROXIMATION}}那段代码是对的。你看看if(Abs...你会看到“我正在检查我是否在容忍范围内”,这是执行此步骤的正确位置,你甚至不会想“但我是否正确实施了它?"但由于这是您希望代码采用的结构,您实际上可以这样写:a){Solvers=newSolver(a);s.Validate();s.Initialize();while(true){if(s.WithinTolerances())returns.approximation;s.Refine();}}privatevoidValidate(){...}privatevoidInitialize(){...}privateboolWithinTolerances(){...}privatevoidRefine(){...}}当你有一个只做一件事的方法时并且当做得非常好时,你不太可能犯错误,如果方法可以独立测试,你会得到加分。注意我上面刚刚创建的类可能是一个抽象基类!我们可以有一整套求解器,使用不同的技术来解决不同的问题。这些技术中的任何一种都可以快速找到您的错误。现在学习所有这些。进一步阅读:if(Math.Abs??(a)a在循环内没有改变,所以never不会返回。如评论中所述,您应该错误地使用术语Math.Abs??(a-val),而不是Math.Abs??(a),即初始值。正如其他人指出的那样,您永远不会满足返回条件。考虑改成这样:if(Math.Abs??(a)改成上面的C#LearningTutorial:Whydoesn'tthissquarerootapproximationwork?全部内容分享出来,如果对大家有用需要进一步了解C#LearningTutorial,希望大家多多关注---if(Math.Abs??(a-val)本文采集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如有转载请注明出处:
