请解释一下这个C程序的工作原理 #包括 无效函数1(整数n) { 如果(n==0)返回; printf(“%d”,n); func2(n-2); printf(“%d”,n); } 无效函数2(整数n) { 如果(n==0)返回; printf(“%d”,n); func1(++n); printf(“%d”,n); } void main() { 职能1(5); }

请解释一下这个C程序的工作原理 #包括 无效函数1(整数n) { 如果(n==0)返回; printf(“%d”,n); func2(n-2); printf(“%d”,n); } 无效函数2(整数n) { 如果(n==0)返回; printf(“%d”,n); func1(++n); printf(“%d”,n); } void main() { 职能1(5); },c,function,output,function-calls,C,Function,Output,Function Calls,输出:53423123445 我不理解导致上述输出的代码中发生的控制流。有人能解释一下吗。提前感谢:)如果我们对每个printf进行注释,这样我们就可以知道程序中哪个部分的数字了。我还将把起始条件改为3,这样我们就可以完成整个过程 #include<stdio.h> void func1(int n) { if(n==0) return; printf("%d",n); func2(n-2); printf("%d",n); } void func2(in

输出:53423123445


我不理解导致上述输出的代码中发生的控制流。有人能解释一下吗。提前感谢:)

如果我们对每个
printf
进行注释,这样我们就可以知道程序中哪个部分的数字了。我还将把起始条件改为3,这样我们就可以完成整个过程

#include<stdio.h>

 void func1(int n)
 {
  if(n==0) return;
  printf("%d",n);
  func2(n-2);
  printf("%d",n);
 }

 void func2(int n)
 {
  if(n==0) return;
  printf("%d",n);
  func1(++n);
  printf("%d",n);
 }

void main()
{
    func1(5);
}
  • func1(3)打印3并调用func2(1)
  • func2(1)打印1并调用func1(2)
  • func1(2)打印2个调用func2(0)
  • func2(0)立即返回
  • 现在我们已经到达递归的底部。此时,我们已经建立了一个函数调用堆栈

  • 职能1(3)
  • 职能2(1)
  • 职能1(2)
  • 一旦func2(0)返回,对func1(2)的调用将从它停止的地方开始,我们将从下到上遍历堆栈

  • func1(2)打印2并返回func2(1)
  • func2(1)打印2,因为它增加了n,并返回到func1(3)
  • func1(3)打印3并返回main()
  • main()返回,程序退出

  • 如果我们对每个
    printf
    进行注释,那么就更容易理解了,这样我们就可以知道哪个数字来自程序的哪个部分。我还将把起始条件改为3,这样我们就可以完成整个过程

    #include<stdio.h>
    
     void func1(int n)
     {
      if(n==0) return;
      printf("%d",n);
      func2(n-2);
      printf("%d",n);
     }
    
     void func2(int n)
     {
      if(n==0) return;
      printf("%d",n);
      func1(++n);
      printf("%d",n);
     }
    
    void main()
    {
        func1(5);
    }
    
  • func1(3)打印3并调用func2(1)
  • func2(1)打印1并调用func1(2)
  • func1(2)打印2个调用func2(0)
  • func2(0)立即返回
  • 现在我们已经到达递归的底部。此时,我们已经建立了一个函数调用堆栈

  • 职能1(3)
  • 职能2(1)
  • 职能1(2)
  • 一旦func2(0)返回,对func1(2)的调用将从它停止的地方开始,我们将从下到上遍历堆栈

  • func1(2)打印2并返回func2(1)
  • func2(1)打印2,因为它增加了n,并返回到func1(3)
  • func1(3)打印3并返回main()
  • main()返回,程序退出

  • 通过教学生递归如何处理局部变量,我发现最简单的理解方法是,如果你完全按照计算机所做的去做, -一步一步地处理它,写下调用的内容,以及变量值何时更改

    例如:

    func1 before: 3
    func2 before: 1
    func1 before: 2
    func1 after: 2
    func2 after: 2
    func1 after: 3
    
    您还需要了解,在每个函数调用中, 函数中对“n”的更改不会更改较早的 从调用它的位置获取的值

    如果你想象计算机做这样的事情,你会看得更清楚: 每个函数调用都会在堆栈上创建一组新的变量, 当函数返回时,它的变量从堆栈中删除

    main
      func1(5)
        n=5
        printf  5
        func2(5-2)
          n=3
          print 3
          ++n
          n=4
          func1(4)
            n=4
            print 4
            func2(4-2)
              n=2
              print 2
              ++n
              n=3
              func1(3)
                n=3
                print 3
                func2(3-2)
                  n=1
                  print 1
                  ++n
                  n=2
                  func1(2)
                    n=2
                    print 2
                    func2(2-2)
                      n=0
                      if n==0 => return
                    print 2
                  print 2
                print 3
              print 3
            print 4
          print 4
        print 5
      //done
    

    等等,直到它结束,最后一个“5”被打印出来。

    我通过教学生递归如何处理局部变量发现,理解它最简单的方法是,如果你完全按照计算机的操作, -一步一步地处理它,写下调用的内容,以及变量值何时更改

    例如:

    func1 before: 3
    func2 before: 1
    func1 before: 2
    func1 after: 2
    func2 after: 2
    func1 after: 3
    
    您还需要了解,在每个函数调用中, 函数中对“n”的更改不会更改较早的 从调用它的位置获取的值

    如果你想象计算机做这样的事情,你会看得更清楚: 每个函数调用都会在堆栈上创建一组新的变量, 当函数返回时,它的变量从堆栈中删除

    main
      func1(5)
        n=5
        printf  5
        func2(5-2)
          n=3
          print 3
          ++n
          n=4
          func1(4)
            n=4
            print 4
            func2(4-2)
              n=2
              print 2
              ++n
              n=3
              func1(3)
                n=3
                print 3
                func2(3-2)
                  n=1
                  print 1
                  ++n
                  n=2
                  func1(2)
                    n=2
                    print 2
                    func2(2-2)
                      n=0
                      if n==0 => return
                    print 2
                  print 2
                print 3
              print 3
            print 4
          print 4
        print 5
      //done
    

    等等,直到它完成,最后一个“5”被打印出来。

    你以前在编程中处理过递归吗?没有。是这样吗?请查看c中的递归。您可以检查不同站点的(例如:Tutorialspoint),该程序不会编译,因为可以使用@AnttiHaapala
    void main()
    。当然这不是正确的签名,但它会起作用。你以前在编程中处理过递归吗?没有。是这样吗?看看c中的递归。您可以检查不同站点的(例如:Tutorialspoint),该程序不会编译,因为可以使用@AnttiHaapala
    void main()
    。当然这不是正确的签名,但它会起作用的。