C语言学习(递归)

C语言递归算法学习与示例

       今天学习了递归算法的核心思想和几个经典问题,初学递归真是有点费脑筋,比如汉诺塔问题,下面讲我今天所写代码分享给大家。

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
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值