17递归
递归
定义:
- 一个函数自己直接或间接调用自己
递归满足的三个条件
- 递归必须得有一个明确的中止条件
- 该函数所处理的数据规模必须在递减
- 这个转化必须是可解的
循环和递归的关系:
-
递归:优点:好理解 缺点:速度慢 ,存储空间大
-
循环:不易理解,速度快,存储空间小
自调用函数
# include <stdio.h>
void f(int n)
{
if(n == 1)
printf("哈哈\n");
else
f(n-1);
}
int main(void)
{
f(3);
return 0;
}
阶乘的循环实现
# include <stdio.h>
int main(void)
{
int val;
int i, mult = 1 ,s;
printf("请输入一个数字:");
printf("val = ");
scanf("%d",&s);
for(i = val; i>0 ; --i)
{
mult = mult * i;
}
printf("%d的阶乘是:%d\n", val, mult);
return 0;
}
阶乘的递归实现
# include <stdio.h>
long f(long n)
{
if (n == 1)
{
return 1;
}
else
{
return n*f(n-1);
}
}
int main(void)
{
long n;
scanf("%d\n",&n);
printf("%d的阶乘是:%ld\n", n, f(n));
return 0;
}
累加的递归实现
# include <stdio.h>
long sum(int n)
{
if (n == 1)
{
return 1;
}
else
{
return n+sum(n-1);
}
}
int main(void)
{
int n;
printf("请输入累加的截止值!\n");
scanf("%d\n",&n);
printf("1到%d的和是:%ld\n", n, sum(n));
return 0;
}
调用函数
# include <stdio.h>
void f(int n)
{
n = g(n);
return n;
}
void g(int m)
{
m = m*2;
return m;
}
int main()
{
int val;
cal = f(5);
print("val = %d\n", val);
return 0;
}
汉诺塔(逻辑强)
伪算法:
if(n>1)
{
- 先把A柱子上的前n-1个盘子从A借助C移到B
- 将A柱子上的n个盘子直接移到C
- 再将B柱子上的n-1个盘子借助A移到C
}
# include <stdio.h>
void hanluota(int n, char A, char B, char C)
{
if(n == 1)
{
printf("将编号为%d的盘子直接从%c柱子移动到%c柱子",n, A, C);
}
else
{
hannuota(n-1, A, C, B);
printf("将编号为%d的盘子直接从%c柱子移动到%c柱子",n, A, C);
hannuota(n-1, B, A, C);
}
}
int main(void)
{
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("请输入要移动盘子的个数:");
scanf("%d",&n);
hanluota(n, 'A', 'B', 'C');//假定:输入n时输入在A上,盘子从上到下由小到下排列
}
应用:走迷宫
递归的应用:
- 数和森林就是以递归的方式实现的
- 数和图的很多算法就是以递归来实现的
- 很多数据公式就是以递归的方式实现的:斐波拉契数列等
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人