【发布时间】:2016-04-16 12:02:50
【问题描述】:
我正在编写一个程序来使用 C 中的 Newton-Raphson 方法找到给定整数 n 的平方根的近似值。我使用了以下公式:
这是我的代码:
#include <stdio.h>
double newton_raphson(int n, int iter);
double newton_raphson(int n, int iter)
{
if(iter == 0) // base case
return 1;
else // iterative case
return (1/2*(newton_raphson(n, iter-1) + n/(newton_raphson(n, iter-1))));
}
int main()
{
int n;
int i;
printf("Enter a number you want to know the square root of:\n");
fflush(stdout);
scanf("%d", &n);
printf("Enter number of iterations to be worked out:\n");
fflush(stdout);
scanf("%d", &i);
printf("%.3f", newton_raphson(n,i-1));
return 0;
}
当我输入 2 和 3,预期输出为 1.417(3 次迭代后 2 的平方根)时,我得到错误 -1.#IO。例如,当我输入 5 和 2 时,我得到 0.000。我已经对其进行了调试,但仍然无法真正弄清楚问题所在。非常感谢任何帮助。
编辑:详细说明输出
【问题讨论】:
-
将
1/2改为1.0/2.0以强制使用双精度数(或使用0.5) -
你忘记了一些事情。最明显的是您输入的内容,否则我们无法重现您的问题。
-
抛开 int 与 float 的问题不谈,您使用相同的参数递归调用
newton_raphson两次,这将导致调用次数超出您的需要。调用一次并将结果存储在变量中,然后对其进行操作。您也可以将算法呈现为循环而不是使用递归。 -
@StefaniaDamato :这是非常低效的,你的讲师应该注意到这一点并给你更少的分数。如果这有助于将其可视化,那么您在这里所拥有的大致相当于
int fib(int n) { if(n >= 2) return fib(n-1) + fib(n-2); }。 -
在 Newton-Raphsen 函数的开头放置一个 print 语句,您会看到对于您的迭代,您调用了该函数七次。通常,您调用该函数 2^iter - 1 次。第二个调用是多余的,因为它再次评估相同的数据。结果是formulas are pretty,但您通常无法逐字逐句输入它们以获得您想要的。
标签: c