当前位置:网站首页>c语言:深度学习递归
c语言:深度学习递归
2022-07-26 23:29:00 【摸鱼王胖嘟嘟】
作者介绍:大家好,我是摸鱼王胖嘟嘟,可以叫我小嘟
作者主页:摸鱼王胖嘟嘟的个人博客主页.
作者的gitee: 小比特_嘟嘟的个人gitee
系列专栏: 【从0到1,漫游c语言的世界】
小嘟和大家一起学习,一起进步!尽己所能,写好每一篇博客,沉醉在自己进步的喜悦当中🤭。如果文章有错误,欢迎大家在评论区️指正。让我们开始今天的学习吧!
前言
此篇是针对递归的学习,希望大家可以通过这几个问题来加深对递归的理解!
注:本篇只是从递归的方法上探讨问题,方法很多,大家可以自己查找进行学习!
应用1:猴子吃桃
猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第10天时,想再吃时(即还没吃),发现只有1个桃子了。
问:最初共多少个桃子?
#include<stdio.h>
/* 猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半, 并再多吃了一个!以后每天猴子都吃其中的一半,然后再多 吃一个。当到第10天时,想再吃时(即还没吃),发现只有1 个桃子了。问:最初共多少个桃子? 思路分析(逆推) 1.day = 10 时 有 1个桃子 2.day = 9 时 有 (day10 + 1)* 2 = 4 3.dat = 8 时 有 (day9 + 1) * 2 = 10 4.规律就是 前一天的桃子 = (后一天的桃子 + 1)* 2 5.递归 */
int peach(int day)
{
if (day == 10)
{
return 1;//第10天只有1个桃子
}
else if (day >= 1 && day <= 9)
{
return (peach(day + 1) + 1) * 2;
}
else
{
printf("day在1-10之间");
return -1;
}
}
int main()
{
int day = 0;
scanf("%d", &day);
int ret = peach(day);
printf("第%d天的挑子一共有:%d个\n",day, ret);
return 0;
}
效果展示:

应用2:斐波那契问题
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
斐波那契数列指的是这样一个数列:
1,1,2,3,5,8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765,
10946, 17711, 28657, 46368 ……
这个数列从第3项开始,每一项都等于前两项之和。
递归解法:

#include<stdio.h>
int fib(int n)
{
if (n == 1 || n == 2)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", fib(n));
return 0;
}
效果展示:
️大家有没有发现,光是求第8个斐波那契就需要这么多过程,如果求55个斐波那契数甚至更大,那不是要算很久吗?即便是电脑来帮你算也需要花费大量的时间,所以求斐波那契数列是不建议大家去使用递归方法来解的,那么我们还有什么办法呢?
非递归解法:
️我们发现使用递归是从后往前的算,那么我们可不可以试着从前往后的算呢?

#include<stdio.h>
int fib(int n)
{
if (n <= 2)
{
return 1;
}
else
{
int a = 1;
int b = 1;
int c = 0;
while (n--)
{
c = a + b;
a = b;
b = c;
}
return c;
}
}
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", fib(n));
return 0;
}
效果展示:
应用3:汉诺塔问题
汉诺塔传说
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一个柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
假如每秒钟移动一次,共需多长时间呢?移完这些金片需要5845.54亿年以上,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
那么我们该如何解了?
我的解法是把A柱子抱起来搬到C柱子上!
噗!开个玩笑~~
️我们了解了背景之后,就让我一步一步带大家解析汉诺塔的过程吧!
这是初始的盘子:
现在我们的任务就是通过一个方法来讲A盘上的圆盘全部移动到C盘上面,并且要求每次只能移动一个圆盘以及小圆盘不能放到大圆盘下面。


n表示有多少个圆盘
当n=1时:移动1 方向 A—>C; 移动一次
当n=2时:移动1 方向 A—>B;
移动2 方向 A—>C;
移动1 方向 B—>C; 移动三次
当n=3时:移动1 方向 A—>C;
移动2 方向 A—>B;
移动1 方向 C—>B;
移动3 方向 A—>C;
移动1 方向 B—>A;
移动2 方向 B—>C;
移动1 方向 A—>C; 移动七次
利用穷举的办法,对于汉诺塔的移动次数进行计算:
1-4阶汉诺塔的移动步骤:
我们可以发现圆盘移动是有规律的:
1>把n-1个圆盘由A移到B;
2>把第n个圆盘由A移到C;
3>把n-1个圆盘由B移到C;
我们是把n-1个圆盘看成一个整体去分析的,
那如何把n-1个圆盘从A移到B呢?(借助C塔移到了B上)
我们可以把n-2个圆盘看成一个整体去分析:
1>把n-2个圆盘由A移到C;
2>把第n-1个圆盘由A移到B;
3>把n-2个圆盘由C移到B;
那如何把n-1个圆盘从B移到C呢?(借助A塔移到了C上)
1>把n-2个圆盘由B移到A;
2>把第n-1个圆盘由B移到C;
3>把n-2个圆盘由A移到C;
重点:
(1)中间的一步是把最大的一个盘子由A移到C上去;
(2)中间一步之上可以看成把A上n-1个盘子通过借助C塔移到了B上,
(3)中间一步之下可以看成把B上n-1个盘子通过借助A塔移到了C上
我们不难推出递归表达式:f(n-1) + 1 + f(n-1) = 2 * f(n - 1) + 1
那么可以实现下面的代码:
#include<stdio.h>
int step_number(int num)
{
if (1 == num)
{
return 1;
}
else
{
return 2 * step_number(num - 1) + 1;
}
}
void move(int num,char a,char b,char c)
{
//num 表示移动的个数
//a,b,c分别表示A塔,B塔,C塔
if (1 == num)
{
printf("%c->%c\n",a,c);
}
else
{
//如果有多个盘,可以看成两个盘,最下面的和最上面的所有盘
//1.移动上面所有的盘到b,借助c
move(num - 1, a, c, b);
//2.把最下面的这个盘,移动到c
printf("%c->%c\n",a,c);
//3.再把b塔的所有盘,移动到c,借助a
move(num - 1, b, a, c);
}
}
int main()
{
int num = 0;
scanf("%d", &num);//塔数
move(num,'A', 'B', 'C');
int ret = step_number(num);
printf("完成%d层的汉诺塔需要%d步\n", num, ret);
return 0;
}
效果展示:
总结
关于递归知识学习的应用还包括八皇后、小鼠走迷宫等应用,这些对现在的小嘟是有很大难度的,等小嘟完全掌握之后,一定会更新的!希望大家能够多多支持!
边栏推荐
- Encyclopedia of websites commonly used by people who know current affairs
- After ten years of testing, I want to say to my friends who are still confused: one thing is to do a good job in personal planning
- [brother Yang takes you to play with the linear table (I) - sequence table]
- [C language programming] branch structure
- 【Code】剑指offer 04二维数组中的查找
- Find a specific number in an ordered array
- 软件测试基础理论知识—概念篇
- GoatGui邀你参加机器学习研讨班
- Area optimization of digital chips: detailed explanation of question 1 in the digital direction of the third "Huawei Cup" graduate innovation core competition
- cookie增删改查方法
猜你喜欢
随机推荐
Basic theoretical knowledge of software testing - concept
多线程的具体使用
【用C语言绘制直角坐标系】
[Li Kou] 1859. Sort sentences
蚂蚁京东新浪10位架构师424页佳作深入分布式缓存从原理到实践pdf
在腾讯测试岗干了5年,7月无情被辞,想给还在划水的兄弟提个醒.....
The pointer is really profound!!!
Is it necessary to open an account on site for securities speculation? Is it safe to open an account online
The latest multi-threaded & highly concurrent learning materials, interview confidence
OSPF summary (mind map)
f8抓交通、f9抓兔子、f10turtle
【用C语言绘制谢尔宾斯基三角形】
Solve every bit of an integer
想要彻底搞的性能优化,得先从底层逻辑开始了解~
The problem of storing elements in TreeSet collection
Hcip first day static routing comprehensive experiment
Constant knowledge explanation of C language
OSPF总结(思维导图)
证券公司哪家手续费最低?手机上开户安全吗
Plato Farm有望通过Elephant Swap,进一步向外拓展生态









![[draw sherpinski triangle in C language]](/img/e6/9d1d088d1c7675c23725443000329b.png)