输入循环 while 函数

Input Loop in While function

本文关键字:函数 while 循环 输入      更新时间:2023-10-16

我有一个关于程序中看似无限的输入循环的快速问题。我确定它发生在 while 循环中,我想知道这是因为我的数学还是我的编码。虽然循环对我来说仍然是新的,所以任何帮助或解释都会很好!该程序是使用牛顿方法查找 z 的第 p 根、残差和循环之间改进的程序的开始。另外,我想知道 for 循环是否更适合我的目的。到目前为止:

#include <iostream>
#include <cmath>
using namespace std;
double Newton(double z, int p, double &x, double &n);
int main(){
    double z, x, n, residual, bai, bri;
    int p;
    x = 1;
    n = 1;
    cin >> z >> p;
    double roots = Newton(z, p, x, n);
    cout.precision (5);
    cout << "Input: z = " << z << ", p = " << p << endl << "Root = " << x << endl;
}
double Newton(double z, int p, double &x, double &n){
    x = (x - ((pow (x, p) - z)/(p * (pow (x, (p - 1))))));
    while (x != 0){
            x = (x - ((pow (x, p) - z)/(p * (pow (x, (p - 1))))));
            n++;
    }
    return x;
}

通常,使用浮点运算测试相等性是一个坏主意。 我不知道你的数学和/或编码是否正常,但我猜x的可能性永远不会完全等于零。 考虑将其更改为类似 while (fabs(x) < 1e-10) .

Nickie 对你的无限循环问题有一个很好的答案。我只是想补充一点,在这种情况下,您对 while 循环的使用很好,因为您没有明确的迭代变量。

例:

for (int i=0; i < 10; ++i) {
    cout << i << endl;
}

很明显,变量i表示迭代,因为它是在每次迭代结束时递增的迭代,也是作为延续条件进行测试的变量。

相比之下,循环使用 x 来测试连续性,而n递增。对于 for 循环来说,这不是一个明确的案例。在您的案例中,for 循环如下所示:

double Newton(double z, int p, double &x, double &n) {
    for (x = (x - ((pow (x, p) - z)/(p * (pow (x, (p - 1)))))); x != 0; n++) {
        x = (x - ((pow (x, p) - z)/(p * (pow (x, (p - 1))))));
    }
    return x;
}

这也不是很糟糕,但我认为 while 循环更清晰。