Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在递归函数c++;_C++_Recursion - Fatal编程技术网

C++ 在递归函数c++;

C++ 在递归函数c++;,c++,recursion,C++,Recursion,我试图用递归的方法求平方根。我不想让代码解决这个问题!我几乎完成了,但我不知道如何保持函数的原始值: float raizCuadrada(float num, float err) { float nuevo = num / 2; float resta=(nuevo*nuevo)-num; if(resta>err){ return (raizCuadrada(nuevo, err)); } else if (resta &

我试图用递归的方法求平方根。我不想让代码解决这个问题!我几乎完成了,但我不知道如何保持函数的原始值:

float raizCuadrada(float num, float err) {

    float nuevo = num / 2;
    float resta=(nuevo*nuevo)-num;


    if(resta>err){
        return (raizCuadrada(nuevo, err));
    }
    else if (resta <= err) {
        return (nuevo);
    }
}
float raizCuadrada(float num,float err){
浮点数=num/2;
float resta=(新潮*新潮)-num;
如果(重启>错误){
返回(raizCuadrada(新奥尔良));
}

else if(resta您可以在代码顶部定义一个全局变量

float num_fixed;

float raizCuadrada(float num, float err) {

    float nuevo = num / 2;
    float resta=(nuevo*nuevo)-num_fixed;

    if(resta>err){
        return (raizCuadrada(nuevo, err));
    }
    else {
        return (nuevo);
    }   
}

int main(void){
  float num = 2.0;
  float err = 0.000001;
  float output;
  num_fixed = num;
  output = raizCuadrada(num, err);
}

我推荐已经提出的两种解决方案,要么重载一个包含三个参数的函数,要么使用全局变量

如果你出于某种原因不想这样做,你可以使用一些诡计:

float raizCuadrada(float num, float err) {
   static float org = -1;
   if(org<0)
      org = num;
   float nuevo = num / 2;
   float resta=(nuevo*nuevo)-org;
   float ret;
    if(resta>err)
        ret = raizCuadrada(nuevo, err);
    else 
        ret = nuevo;
    if(org>=0)
       org=-1;
    return ret;
}      
float raizCuadrada(float num,float err){
静态浮动组织=-1;
如果(或错误)
ret=raizCuadrada(新奥尔良);
其他的
ret=新意;
如果(组织>=0)
org=-1;
返回ret;
}      
除非你真的有特殊需要,否则我不会推荐这种方法。它很容易出错,我想不出有什么真正的好处。但既然它是可能的,我想展示它

我基本上想知道如何“保存”第一个“num”呼叫, 要始终在“resta”中使用它,“-num”应始终为 第一把的号码

注意:我不能输入更多的输入。我只能输入1个数字和 错误c++

我最常使用的解决方案是将这两种“努力”分为两种方法:

1) 从一个方法开始(使用您原来的方法名)将第一个变量保存到一个安全的空间。我将把“where”留给您。在这里,我只是编了一个新的变量名(origNum)在每个方法的代码中都有一个可用的范围。在C++中,我希望包含这些方法的类将“保存”并使用实例数据属性。
float  raizCuadrada(float num, float err)  // same name as original
{
    origNum = num;             // "save" original 'num'

    return (raizCuadrada2(num, err));  // continue normally
}
2) 然后,对您以前的代码进行一次轻微的重新计算,使用“saved”值。由于您无法更改参数,我建议稍微更改方法名称,在这里我创建了带有后缀“2”的raizCuadrada

float raizCuadrada2(float num, float err) {
   float nuevo = num / 2;
   float resta=(nuevo*nuevo)-origNum;  // use origNum here

   if(resta>err){
      return (raizCuadrada(nuevo, err));
   }
   else if (resta <= err) {
      return (nuevo);
   }
}
float raizCuadrada2(float num,float err){
浮点数=num/2;
float resta=(nuevo*nuevo)-origNum;//在这里使用origNum
如果(重启>错误){
返回(raizCuadrada(新奥尔良));
}

否则如果(resta创建一个包含3个参数的重载。最后一个参数是原始的num。包含2个参数的函数只调用包含3个参数的函数,包含3个参数的函数完成所有工作。你确定这个算法吗?我无法让它工作。“num_fixed”需要在使用之前进行初始化。是的,这将在main中完成函数,并设置为初始值。我已经更新了我的答案,显示了一个基本的main函数。我也用另一个替换了其他的。在代码中,<代码> C++ >代码>标签>代码> MalOC/,给了你一个下限的投票。我会投票,但是我认为有一些事情需要修复。org将在多个递归级别上被释放。@miliesmith我可以看到,当我尝试此操作时,它将被释放多次,但我无法理解如何被释放。你能解释一下吗?我修复了malloc->new和初始化。我现在完全删除了动态内存。当resta>err时,算法将被递归多次。它是f因为你从未将其设置为nullptr,所以rees在每一个方面都进行了组织。更改看起来不错。我稍后有时间会仔细查看。