递归调用函数,参数在内存中是怎么调用的

大家好,学习c++中遇到一个瓶颈问题
在 用递归函数解决汉诺塔问题时,源程序是 这样的

#include
using namespace std;
int k=0,n; 
void mov(int n,char a,char c,char b)
{if(n==0)return;
mov(n-1,a,b,c);
k++;
 cout<":from"<"->"<mov(n-1,b,c,a);
 }
int main()
{cout<<"n=";
cin>>n;
mov(n,'a','c','b');
return 0;
}


这是课本上的例子
因为我搞不明白 程序在运行时内存这块是怎么运行的,于是我这样改了这样来监督参数的具体值:

#include
using namespace std;
int k=0,n; 
void mov(int n,char a,char c,char b)
{if(n==0)return;
cout<"???"<"v"<mov(n-1,a,b,c);
cout<"?"<"_>"<"m"<mov(n-1,b,c,a);
cout<<"??"<int main()
{cout<<"n=";
cin>>n;
mov(n,'a','c','m');
return 0;
}

如果把参数想象成在保存在内存中的一个盒子,修改后的运行

img


递归调用到红线部分不就结束了,运行到红线n是1不覆盖了前面的值了吗,怎么n又突然 变成2了呢?实在想不出来程序在内存中是怎么运行,请教各路解释提点一下,谢谢,因为到这儿我实在搞不明白

基于Monster 组和GPT的调写:

  • 你的疑惑在于递归调用中参数的传递和保存。实际上,在递归调用中,每次调用都会创建一个新的函数栈帧来保存该调用的参数和局部变量等信息,这个新的函数栈帧是独立的,不会影响到其他函数栈帧。
  • 在汉诺塔问题中,当n等于1时,会执行一次mov(0, 'a', 'c', 'm'),然后直接返回到上一级调用,也就是执行mov(1, 'a', 'c', 'm')中的第二个mov函数调用。因此,在你的输出中,虽然n在第一个mov调用中被输出为1,但在后面的mov调用中仍然会被赋值为2,因为这些调用都是独立的函数栈帧。
  • 另外,由于递归调用是深度优先搜索,所以在每个递归层级中,只有最上面的一次输出语句会被执行,因此你的输出结果可能并不是你期望的那样。
  • 如果你想更好地理解递归调用的机制,可以尝试画出递归调用的函数调用图,以便更清晰地看到每个函数栈帧的调用和返回。

这是人回答的还是ai回答的呀!