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 esp8266控制共阳极wrgb灯板无法关闭所有led灯
  • ¥100 python读取速度问题
  • ¥15 stm32f407使用DMA问题
  • ¥15 您好 这个API接口该怎么弄 网站搭建好了 API也有 现在就不知道该怎么填写API 不知道怎么用
  • ¥88 用uniapp写一个多端的程序,用到高德地图,用高德的JSAPI吗?
  • ¥20 关于#c++#的问题:水果店管理系统
  • ¥30 dbLinq最新版linq sqlite
  • ¥20 对D盘进行分盘之前没有将visual studio2022卸载掉,现在该如何下载回来
  • ¥15 完成虚拟机环境配置,还有安装kettle
  • ¥15 2024年全国大学生数据分析大赛A题:直播带货与电商产品的大数据分析 问题5. 请设计一份优惠券的投放策略,需要考虑优惠券的数量、优惠券的金额、投放时间段和投放商品种类等因素。求具体的python代码