函数递归:
函数自己调用自己的行为叫做递归,可能导致出现死循环的效果
递归可实现一种分治的算法思想,把一个复杂的大问题,分解成若干个相同的小问题,直到问题全部解决
1、设置出口
2、解决一个小问题
3、调用自己
递归函数每次调用自己都会在栈内存产生一份自己的拷贝,直到到达出口,才一层层释放,因此递归非常耗费内存,与循环相比速度非常缓慢,能用循环解决的问题就不要使用递归
递归优缺点:
1、耗费内存、速度慢
2、好理解、思路清晰
3、可以解决非线性问题的执行过程
例1:使用递归模拟汉诺塔的移动过程
#include <stdio.h>
void hanoi(int n,char s,char t,char d)
{
//s起点 t中转点 d终点
if(1 == n)
{
printf("1 from %c to %c\n",s,d);
return;
}
hanoi(n-1,s,d,t);
printf("%d from %c to %c\n",n,s,d);
hanoi(n-1,t,s,d);
}
int main(int argc,const char* argv[])
{
hanoi(5,'A','B','C');
}
例2:用递归实现0~9的全排列
#include <stdio.h>
void whole(int arr[],int n,int m)
// n是全排列的起点下标 m是元素个数
{
if(n == m-1)
{
for(int i=0; i<m; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return;
}
for(int i=n; i<m; i++)
{
//交换所有的值到第n位
int tmp = arr[i];
arr[i] = arr[n];
arr[n] = tmp;
// 对后面n+1开始全排列
whole(arr,n+1,m);
//把值交换回第n位
tmp = arr[i];
arr[i] = arr[n];
arr[n] = tmp;
}
}
int main(int argc,const char* argv[])
{
int arr[] = {0,1,2,3,4,5,6,7,8,9};
whole(arr,0,10);
}
本文介绍了C语言中的函数递归概念,通过递归算法详细阐述了如何模拟汉诺塔的移动过程以及实现0到9的全排列。递归虽然消耗内存且速度较慢,但其思路清晰,能有效解决复杂问题。
2万+

被折叠的 条评论
为什么被折叠?



