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 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?