我试图理解以下程序,其中存在连续的递归函数调用,但在跟踪如何加载大头钉时感到困惑。
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])
- 返回
我是一名优秀的程序员,十分优秀!