从前有个老和尚在讲从前有个老和尚在讲一口井的故事的故事
看着晕?其实意思明确,加上括号再看
从前有个老和尚在讲【从前有个老和尚在讲【一口井】的故事】的故事
这就是递归
“一口井”就是截止条件,防止无限递归
“从前有个老和尚在讲()的故事”就是递归机,就是每层递归都要做什么
想要输出这种“套娃”似的文字,用递归实现是在代码上最简单的方式。
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来调用新的函数。