查找不带while和for循环的根

Find root without while and for loop

本文关键字:循环 for while 查找      更新时间:2023-10-16

我正在编写的程序应该找到给定double的根。

条件是:不允许使用while和for循环。任何类型的循环都是不允许的。

我们的教授说禁止使用stdlib函数sqrt()

我开始编写代码,但仍然不起作用。希望任何人都能帮忙。

#include <cstdlib>
#include <iostream>    
using namespace std;
double mysqrt(double a, double b, double c);
int main(int argc, char** argv) {
    double dBegin{0};
    double dOldroot{0};
    double dNewroot{0};
    double a{0};1
    cin >> dBegin;
    dOldroot = dBegin;
    mysqrt(a, dOldroot, dNewroot);
    cout << dNewroot;
    return 0;
}
double mysqrt(double a, double b, double c) {
    c = (b + (a / b)) / 2.0;
    if (a != 8) {
        c = mysqrt(a++, b, c);
    }
    return c;
}

我正在使用Newton-Raphson方法来找出给定数字num(在我的代码中)的平方根

您可能会发现此视频链接很有用:单击此处。用这个算法我解决了这个问题。

这是我的密码。

#include <iostream>
using namespace std;
/* we are gonna use Newton-Raphson's method to find its square because 
   it converges quickly, even calculators use this algo. to find the sqr-root */
double find_sqrt(double x, int num, int count) {
    if(count == 0) 
        return x;
    double f_x  = x*x - num;
    double f_dx = 2*x;
    double res = x - (f_x/f_dx);
    x = find_sqrt(res, num, count -1);
    return x;
}
int main() {
    double num;
    cin >> num;
    /* Here 20 is the maximum number of times it will run and 
    num/2 is the random number send to the function between the range 1 to num */
    cout << find_sqrt(num/2, num, 20);  
    return 0;
}

结果可能不太精确,但它几乎总是接近数字的实际平方根
原因:浮点精度错误。我相信你一定知道这件事。

  • 您有垃圾1,导致double a{0};之后出现编译错误
  • 您的代码将执行无限递归,因为第一个参数不会更新。使用double作为计数器也不是一个好主意
  • 您在main()中丢弃了从mysqrt返回的值
  • 使用参数作为局部变量而不读取其值不是一个好主意

修复这些错误,你的代码将是这样的:

#include <cstdlib>
#include <iostream>
using namespace std;
double mysqrt(int a, double b);
int main(int argc, char** argv) {
    double dBegin{0};
    double dOldroot{0};
    double dNewroot{0};
    int a{0};
    cin >> dBegin;
    dOldroot = dBegin;
    dNewroot = mysqrt(a, dOldroot);
    cout << dNewroot;
    return 0;
}
double mysqrt(int a, double b) {
    double c = (b + (a / b)) / 2.0;
    if (a != 8) {
        c = mysqrt(a + 1, b);
    }
    return c;
}

此代码未能计算平方根,但已编译并在运行时很快退出。