递归故事

从前有个老和尚在讲从前有个老和尚在讲一口井的故事的故事

看着晕?其实意思明确,加上括号再看

从前有个老和尚在讲【从前有个老和尚在讲【一口井】的故事】的故事

这就是递归

“一口井”就是截止条件,防止无限递归
“从前有个老和尚在讲()的故事”就是递归机,就是每层递归都要做什么

想要输出这种“套娃”似的文字,用递归实现是在代码上最简单的方式。

1.左右向中间套娃式递归

这种的模式可以形成【左右套中间】的结果,类似于:

void 老和尚讲故事(int 层)
{
	//左边的壳

	//截止条件,不满足就深入一层,否则就是套娃的核,然后脱出左套娃壳,返回并顺序进行右套娃
	if (层 < 1)
	{
		//最中间的核心
		return;
	}
	
	//深入一层

	//右边的壳
	return;
}

可执行代码:

#include<stdio.h>
#define 层 layer
#define 老和尚讲故事 laoheshang

void 老和尚讲故事(int)
{
	printf("从前有个老和尚在讲(");

	//截止条件
	if (< 1)
	{
		printf("一口井的故事");
		return;
	}

	老和尚讲故事(- 1);

	printf(")的故事");
	return;
}

int main(){	老和尚讲故事(2);}

执行结果:

从前有个老和尚在讲(从前有个老和尚在讲(从前有 个老和尚在讲(一口井的故事)的故事)的故事

2.分多叉式搜索递归

这种可以解决【有十个台阶,一步或两步走,上楼梯有几种上法?】这种“模式一样,参数不同,要全面搜索”的问题:

#include<stdio.h>
#define 层 layer
#define 老和尚讲故事 laoheshang

void 老和尚讲故事(int)
{
	printf("从前有个老和尚在讲(");
	//满足条件
	if (== 0)
	{
		printf("一口井");
		//这里应该留一个想要修改的结果……
	}
	//不符合的条件
	if (< 1)
	{
		return;
	}

	//分叉可能
	老和尚讲故事(- 3);
	老和尚讲故事(- 2);
	老和尚讲故事(- 1);

	printf(")的故事"); 
	return;
}

int main() { 老和尚讲故事(2); }

输出结果:

从前有个老和尚在讲(从前有个老和尚在讲(从前有 个老和尚在讲(一口井从前有个老和尚在讲(从前有 个老和尚在讲(从前有个老和尚在讲(从前有个老和 尚在讲(一口井)的故事)的故事

分割一下,就是所有满足“层 == 0”的结束时的结果:

从前有个老和尚在讲(从前有个老和尚在讲(从前有个老和尚在讲(一口井
从前有个老和尚在讲(从前有 个老和尚在讲(从前有个老和尚在讲(从前有个老和 尚在讲(一口井)的故事)的故事

3.循环写成递归式

这种类型可以写斐波那契额数列那样【递推】的结果,只不过这是“先递归找最初,再递推回来得结果”

#include<stdio.h>
#define 层 layer
#define 老和尚讲故事 laoheshang

void 老和尚讲故事(int)
{
	printf("从前有个老和尚在讲");

	//截止条件
	if (< 1)
	{
		printf("一口井");
		return;
	}
	return 老和尚讲故事(- 1);
	printf("的故事");//实际没有执行到
}

int main(){	老和尚讲故事(2);}

执行结果:

从前有个老和尚在讲从前有个老和尚在讲从前有个老和尚在讲一口井

另外,当初我理解递归的一个阻碍是,没想到可以利用return来调用新的函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

超自然祈祷

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值