【发布时间】:2020-03-05 05:04:41
【问题描述】:
当我调用 calc() 时,他没有给我 x 的第一个返回值,而是跳回
double x = v1*sqrt((-(2.0*log(s)))/s); 并再次计算 x 并返回 nan。
调试器在第一次尝试返回 x 之前向我显示 x 的值为 -0.525209。我认为这是一个可接受的返回值(双精度)。
有谁知道如何解决这个问题或者他为什么跳回去? (对不起,我还是 C++ 的初学者)
#include <cmath>
#include <cstdlib>
#include <iostream>
double calc(){
double u1 = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);
double u2 = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);
double v1 = (2.0*u1)-1.0;
double v2 = (2.0*u2)-1.0;
double s = pow(v1, 2.0)+pow(v2, 2.0);
if (s >= 1.0){
calc();
}
double x = v1*sqrt((-(2.0*log(s)))/s);
std::cout << "before return " << x << std::endl;
return x;
}
int main(){
double hilfe = calc();
std::cout << "my mumber "<< hilfe << std::endl;
}
【问题讨论】:
-
你永远不会将递归的返回值用于任何事情。你打算退货吗?
-
我的猜测是你对调用堆栈感到困惑,并且你从对 calc() 的调用中递归地返回,而不是跳到你认为的那一行。这样做的正确方法可能是循环
-
fwiw 正确的递归你需要
return calc();目前你的if (s >= 1.0){ calc(); }正在递归,但对返回的值没有影响 -
递归函数的工作方式与非递归函数完全一样——递归函数调用并不意味着“从头开始重新启动这个函数”,它意味着“再次调用这个函数,然后在它返回时从这里继续” ,一如既往。
-
谢谢大家。我注意到我在
if (s >= 1.0)之后错过了 calc() 之前的“返回”。这就是导致问题的原因
标签: c++ function return double