c - 难以理解连续的递归调用

标签 c recursion stack

我试图理解以下程序,其中存在连续的递归函数调用,但在跟踪如何加载大头钉时感到困惑。

void func(char*);  // function prototype

int main(){
    func("123");
    return 0;
}

void func(char a[]){
    if(a[1]=='\0')
        return;
    func(a+1);
    func(a+1);
    printf("%c",a[1]);
}

这个的输出是 3 3 2

如果有人可以就此提出建议,我们将不胜感激......

这种多重递归调用是否以任何方式有益或在特定问题领域找到应用......?

最佳答案

只需将自己置于 CPU 的位置并逐行执行(或使用调试器来帮助完成该任务)。

第一个电话是

func("123")

本次调用不满足终止条件a[1] == '\0',所以调用

func("23");

对 func("23") 的调用依次调用

func("3")

这确实满足返回条件。因此,该调用返回到之前的调用者 func("23")。

由于线路原因,func("23") 继续调用 func("3")

func(a+1);
func(a+1);

继续这个在你脑海中执行程序的过程,并记下每次调用 printf 时会发生什么。这将解释您的输出。

更新

请注意,对 printf() 的调用发生在递归调用之后,例如调用

功能(“123”)

会像这样进行

  • 输入函数(“123”)
  • 不满足终止条件
  • 调用 func("23")
  • 再次调用 func("23")
  • Printf("3")(即 a[1])
  • 返回

关于c - 难以理解连续的递归调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31522098/

相关文章:

c - 每行代码分配多少内存?

java - 来回遍历数组

c - 递归和的大 O 运行时

algorithm - 如何计算此斐波那契算法的效率?

stack - 我可以为递增堆栈的增长方向配置ARM处理器吗?

从函数返回值比较 C 中的宏

c - 使用预处理器从 C 中的函数中获取 "remove"前缀

c++ - 递归。 return func() 和 if (func()) return true 有什么区别?

java - 使用 java.util.Stack.iterator 显示堆栈内容

android - 如何调试Android ANR?