yujx2114 2023-04-22 10:05 采纳率: 100%
浏览 44
已结题

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

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

#include<iostream>
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<<k<<":from"<<a<<"->"<<c<<endl;
mov(n-1,b,c,a);
 }
int main()
{cout<<"n=";
cin>>n;
mov(n,'a','c','b');
return 0;
}


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

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

}
int main()
{cout<<"n=";
cin>>n;
mov(n,'a','c','m');
return 0;
}

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

img


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

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-04-22 10:12
    关注

    基于Monster 组和GPT的调写:

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

报告相同问题?

问题事件

  • 系统已结题 4月30日
  • 已采纳回答 4月22日
  • 创建了问题 4月22日

悬赏问题

  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。
  • ¥15 有关“完美的代价”问题的代码漏洞
  • ¥15 请帮我看一下这个简易化学配平器的逻辑有什么问题吗?
  • ¥15 暴力法无法解出,可能要使用dp和数学知识
  • ¥15 wpf通过绑定控件自身的值,来实现背景颜色的切换