今天学习了递归算法的核心思想和几个经典问题,初学递归真是有点费脑筋,比如汉诺塔问题,下面讲我今天所写代码分享给大家。
1.简单的递归示例(递归需要有出口,否则会溢出)
// 最简单的递归示例
// 递归就是函数自己调用自己
// 这个示例会导致栈溢出
//int main()
//{
// printf("hello world!");
// main(); // 函数自己调用自己,栈空间会越来越大,直到栈溢出;
//}
2.用递归实现阶乘
int Fac(int n)
{
if (n == 1 || n == 0) // 递归终止条件
{
return 1;
}
else
{
return Fac(n - 1) * n; // 递归调用:n! = (n-1)! * n
}
}
3.非递归数字倒序打印
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// while (n)
// {
// printf("%d", n % 10);
// n /= 10;
4.递归数字正序打印
//void Print(int n)
//{
// if (n>9)
// {
// Print(n/10);
// }
// printf("%d",n%10);
//}
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// Print(n);
//}
5.斐波那契数列的递归实现(高简洁,低效率)
斐波那契数列是第n项=(n-1)+(n-2)
//int Fib(int n)
//{
// if (n <= 2)
// {
// return 1;
// }
// else
// {
// return Fib(n - 1) + Fib(n - 2);
// }
//}
//int main() //斐波那契数列的递归实现
//{
// int n = 0;
// scanf("%d", &n);
// int r = Fib(n);
// printf("%d", r);
// return 0;
////}
6.斐波那契数列的非递归实现
//int main() //feibonacci数列的非递归实现
//{
// int a = 1;
// int b = 1;
// int c = 0;
// int j = 0;
// int i = 0;
// scanf("%d", &i);
// if (i <= 2)
// {
// printf("1");
// }
// else
// {
// for (j = 3; j <= i; j++)
// {
// c = a + b;
// a = b;
// b = c;
// }
// printf("%d", c);
// }
//}
10.汉诺塔问题
汉诺塔(又称河内塔)是一个经典的游戏,最早可追溯至古印度传说,其核规则如下:
(1)有起始柱(A)、辅助柱(B)、目标柱(C)。
(2)有n个圆盘,初始时所有圆盘按大小顺序叠放在起始柱上(最小的在上,最大的在下)
(3)要将所有圆盘由起始柱,借助辅助柱移动到目标柱上,每次只能移动一个圆盘。
(4)核心思想:将n-1个盘子放到辅助柱上。将大盘子由A->C
void hannuota(int n, char A, char B, char C)
{
if (n == 1) // 递归终止条件:只剩一个盘子
{
printf("%c->%c ", A, C); // 直接将盘子从A移动到C
}
else
{
hannuota(n - 1, A, C, B); // 将n-1个盘子从A借助C移动到B
printf("%c->%c ", A, C); // 将第n个盘子从A移动到C
hannuota(n - 1, B, A, C); // 将n-1个盘子从B借助A移动到C
}
}
C语言递归算法学习与示例
1477

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



