c - 请解释这个C程序的工作原理

标签 c function output function-calls

<分区>

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

输出:53423122233445

我不明白导致上述输出的代码中发生的控制流。有人可以解释一下吗?提前谢谢你:)

最佳答案

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

例如:

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

您还需要了解在每个函数调用中, 函数内对 'n' 的更改不会更改较早的 调用位置的值。

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

stack: (empty)

main
  func1(5) ==> push n='5' on stack, then jump to func1()
    stack is now { n=5 }
    so n is 5
    print 5
    func2(5-2) ==> push 'n=3' on stack, then jump to func2()
      stack is now { n=3 } , { n=5 }
      so n is 3
      print 3
      ++n
      stack is now { n=4 } , { n=5 }
      func1(4) ==>  push 'n=4' on stack then jump to func1()
        stack is now { n=4} , { n=4 } , { n=5 }
        so n is 4
        print 4
        func2(4-2) ==> push 'n=2' on stack then jump to func()
          stack is now  {n=2}, {n=4} , { n=4 } , { n=5 }
          ++n
          stack is now {n=3}, {n=4} , { n=4 } , { n=5 }
          ...etc...
           .....
            ....
            stack is eventually {n=0} {n=2}, {n=2}, {n=2} ,{n=1} {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 }
            after func(2-2) is called
            then:
              if n==0 => return;
            the return pops one item {n=0} off the stack, so
            stack is then {n=2}, {n=2}, {n=2} ,{n=1} {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 }
            print 2
            return (deletes {n=2})
          stack is then {n=2}, {n=2} ,{n=1} {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 }
          print 2
         return (deletes {n=2})
       stack is then {n=2} ,{n=1} {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 }
       print 2
       return (deletes {n=2})
     stack is then {n=1} {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 }
     print 1
     return (deletes {n=1})
    stack is then {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 }
   print 3

依此类推,直到完成并打印出最后一个“5”。

关于c - 请解释这个C程序的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42185131/

相关文章:

c - C语言中如何返回一个数组?

c - 打印双指针字符数组时出现运行时错误

c - 使用 gdk_pixbuf_composite() 的 Sprite 贴图问题

javascript - 为什么这个函数不修改最终输出?

java - 正确的return使用方法是什么?

c++ - 我可以通过 G++ 将 CUDA 与 C++ 程序一起使用吗?或者 CUDA 只能用 GCC 编译?

C-分配内存的函数

c++ - STACK.peek 函数,遇到一些问题,C++

c++ - vector 中字符串指针的覆盖输出运算符

bash - 在 BASH/SHELL 中捕获输出和退出代码