都说一如递归深似海,今日我游出来了

1、函数调用模型

先来分析分析函数的调用模型:

void changenum(int *mynum)
{
	*mynum = 300;
}

int main()
{
	int num = 10;
	changenum(&num);
	printf("%d \n", num);
}

上述代码,是通过调用一个函数修改了num的值。用内存四区模型画出来如下图:
在这里插入图片描述
从上图可以看出红色部分是调用函数时的模型。 m y n u m mynum mynum入栈在里面可以打印这个 m y n u m mynum mynum,函数结束时自动释放。

2、再来看一下递归的简单的示例代码

void Inverse(char *str1, char *str2)
{
	if (str1 == NULL || str2 == NULL)//递归调用异常结束条件
	{
		return;
	}

	if (*str1 == '\0')//递归调用结束条件
	{
		return;
	}

	Inverse(str1 + 1, str2);
	printf("out ");// 运行,可以清晰的看出嵌套了几层
	strncat(str2, str1,1);//将str1中1个字符拷贝并追加到str2后面
}

int main()
{
	char *buf = "abcde";
	char buf2[32] = { 0 };//这里全部初始化为0,这样我们只需要往buf2
							//中拷贝字符即可,不用担心在其尾部手动添加一个'\0'
	Inverse(buf,buf2);
	printf("\ninverse buf: %s \n", buf2);
	return 0;
}

3、递归函数的入栈模型和嵌套调用返回流程

在这里插入图片描述
画出上面递归程序的入栈模型如上图(只画到了两层嵌套)。
我们可以看到第一次调用递归函数,入栈的是 a a a的地址,将来在这一层复制字符到 s t r 2 str2 str2后面的话,那就是 a a a。由于递归条件是入栈字符为‘\0’,所以上述模型会入栈6次。可以看打印 o u t out out的次数( o u t out out应该是5次,因为最后一次入栈达到退出条件了,没有机会打印 o u t out out

整个入栈出栈模型如下图所示:
在这里插入图片描述

非常感谢您的阅读,不清晰的地方还请指教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宛如新生

转发即鼓励,打赏价更高!哈哈。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值