【问题标题】:Function doesn't accept first return value, jumps back, calculates another time and returns a "false" value [C++]函数不接受第一个返回值,跳回,计算另一个时间并返回一个“假”值 [C++]
【发布时间】: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 &gt;= 1.0){ calc(); } 正在递归,但对返回的值没有影响
  • 递归函数的工作方式与非递归函数完全一样——递归函数调用并不意味着“从头开始重新启动这个函数”,它意味着“再次调用这个函数,然后在它返回时从这里继续” ,一如既往。
  • 谢谢大家。我注意到我在if (s &gt;= 1.0) 之后错过了 calc() 之前的“返回”。这就是导致问题的原因

标签: c++ function return double


【解决方案1】:

我猜你想要这个:

#include <cmath>
#include <cstdlib>
#include <iostream>    

double calc(){
    for (;;) {
    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)
        continue;

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

这会选择新的随机值,直到 s

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多