Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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++ 理解这个递归函数 #包括 无效e(int); int main() { INTA; a=3; e(a); 返回0; } 空e(整数n) { 如果(n>0) { e(n-1); n=n-1; printf(“%d”,n); e(n-1); n=n-1; } }_C++_C_Recursion - Fatal编程技术网

C++ 理解这个递归函数 #包括 无效e(int); int main() { INTA; a=3; e(a); 返回0; } 空e(整数n) { 如果(n>0) { e(n-1); n=n-1; printf(“%d”,n); e(n-1); n=n-1; } }

C++ 理解这个递归函数 #包括 无效e(int); int main() { INTA; a=3; e(a); 返回0; } 空e(整数n) { 如果(n>0) { e(n-1); n=n-1; printf(“%d”,n); e(n-1); n=n-1; } },c++,c,recursion,C++,C,Recursion,我不明白它是如何计算为0120的,因为我认为如果它是0,if语句将不会运行。。。我知道我不擅长编码,但想知道是否有人能解释它是如何输出0120的。要理解递归函数,必须首先理解递归:) 说真的,尽管去看看维基百科页面和其他你能找到的文章。 这里需要记住的重要一点是,每次对e的递归调用都会增加调用堆栈,一旦返回,就会弹出调用堆栈的最后一帧,返回到上次调用e的位置 以下是在您的案例中实际发生的情况以及为什么会这样做的步骤。调试器还将允许您执行此演练:) e被3呼叫 3>0,所以我们称e为3-1(2)

我不明白它是如何计算为0120的,因为我认为如果它是0,if语句将不会运行。。。我知道我不擅长编码,但想知道是否有人能解释它是如何输出0120的。

要理解递归函数,必须首先理解递归:) 说真的,尽管去看看维基百科页面和其他你能找到的文章。

这里需要记住的重要一点是,每次对e的递归调用都会增加调用堆栈,一旦返回,就会弹出调用堆栈的最后一帧,返回到上次调用e的位置

以下是在您的案例中实际发生的情况以及为什么会这样做的步骤。调试器还将允许您执行此演练:)

  • e被3呼叫
  • 3>0,所以我们称e为3-1(2)
  • 2>0所以我们用2-1(1)来调用e
  • 1>0所以我们用1-1(0)来调用e
  • 0不是>0,所以我们返回到int n=1时
  • 现在我们将n=n-1设为n=0
  • 打印n(打印0)
  • 用0-1(-1)调用e->这只会返回
  • 设置n=n-1,并在n=2时返回
  • 设置n=n-1,使n=1
  • 打印n(打印1)
  • 用n-1(0)调用e->这只是返回
  • 设置n=n-1,并在n=3时返回
  • 设置n=n-1,因此n=2
  • 打印n(打印2)
  • 用n-1(1)调用e
  • 1>0所以用n-1(0)调用e->这只是返回
  • 设置n=n-1(0)
  • 打印n(打印0)
  • 用n-1(-1)调用e->它只返回
  • 设置n=n-1并再次返回到n=3时(原始函数调用)
  • 这是我们函数调用的结束,我们现在返回并打印0120

  • 像这样的简单程序可以通过一些打印来“扩充”以便于理解

    您的原件:

    #include <stdio.h>
    void e(int );      
    int main( ) 
    {   
        int a;    
        a=3;    
        e(a); 
        return 0;
    }    
    
    void e(int n)  
    {    
        if(n>0)   
        {
            e(n-1); 
            n = n-1;     
            printf("%d" , n);      
            e(n-1);  
            n = n-1; 
        }    
    } 
    
    并且它的输出是相同的(即使使用c++编译时也是如此)

    这里是非常类似的递归代码,还有一些打印

    // 0120
    
    ss捕获所有n=x,以一种更简单的方式报告它们,并且不在调试cout之间交错。ss的输出:

    seq=1 e2()   n=3
    seq=2 e2()   n=2
    seq=3 e2()   n=1
    seq=4 e2()   n=0
    seq=4 e2()   else 0
    seq=5 e2()   n=-1
    seq=5 e2()   else -1
    seq=6 e2()   n=0
    seq=6 e2()   else 0
    seq=7 e2()   n=1
    seq=8 e2()   n=0
    seq=8 e2()   else 0
    seq=9 e2()   n=-1
    seq=9 e2()   else -1
    
    注:显示的数字顺序与原始数字相同

    它还显示发生了9个递归调用。(seq=9)
    这是你期望的吗

    。。。调试打印通常也可以提供足够的信息来观察和修复编码错误

    下一步尝试a=0,或1,或2,或4。。。等 并尝试添加其他打印。
    练习

    然后一步一步地检查中间输出,看看它是如何工作的


    祝你好运。

    你看到那行了吗
    n=n-1就在打印位置上方?请澄清您想要输出的内容好吗?使用调试器或手动(非常简单)逐行运行代码,以便更容易理解。@ArtRoss使用钢笔和纸,并运行代码。到目前为止,最简单、最安全的方法是使用调试器逐步运行代码,检查每条线路上的VAR,并记录发生的情况。冲洗/重复,直到你得到它。为什么要投否决票?我错过什么了吗?
    
    // with debug prints
    void e2(int n, std::stringstream& ss)
    {
       static size_t seq = 0;
       std::cout << "seq=" << ++seq << " e2() " << "  n=" << n << std::endl; // invocation sequence
       if(n>0)
       {
          e2(n-1, ss);
          n = n-1;
          ss << "n= " << n << " " << std::flush;
          e2(n-1, ss);
          n = n-1;
       }
       else
          std::cout << "seq=" << seq << " e2()   else " << n << std::endl;
    }
    
    int t267(int argc0)
    {
       std::cout << "argc0: " << argc0 << std::endl << std::endl;
    
       int a = 3;
    
       std::cout << "\ne()----------------------------" << std::endl;
       e(a);
    
       std::cout << "\ne2()----------------------------" << std::endl;
       std::stringstream ss;
       ss << "e2: " << std::endl;
       e2(a, ss);
       std::cout << ss.str() << std::endl;
       std::cout << "\n----------------------------" << std::endl;
    
       return(0);
    
    } // int t267(void)
    
    seq=1 e2()   n=3
    seq=2 e2()   n=2
    seq=3 e2()   n=1
    seq=4 e2()   n=0
    seq=4 e2()   else 0
    seq=5 e2()   n=-1
    seq=5 e2()   else -1
    seq=6 e2()   n=0
    seq=6 e2()   else 0
    seq=7 e2()   n=1
    seq=8 e2()   n=0
    seq=8 e2()   else 0
    seq=9 e2()   n=-1
    seq=9 e2()   else -1
    
    n= 0 n= 1 n= 2 n= 0