找不到while和for循环的root

时间:2016-04-30 13:14:38

标签: c++ algorithm math

我编码的程序应该找到给定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;
}

2 个答案:

答案 0 :(得分:1)

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

您可能会发现此视频链接很有用:Click Here。使用这个算法我已经解决了这个问题。

这是我的代码。

#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 :(得分:0)

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

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

#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;
}

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