函数递归的学习与应用

汉诺塔问题:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但规则是每次只允许移动一个盘子,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动的过程中可以利用B座。要求编写程序输出移动盘子的步骤。

 

#include<stdio.h>

void Swap(int n, char a, char b, char c)//把n个盘子,从a通过b移动到c
{
    if (n == 1)//
    {
        printf("%c-- >%c\n", a, c);//只有一个盘子,直接从a移动到c
    }
    else
    {
        Swap(n - 1, a, c, b);//将上面的n-1个盘子,从a通过c移动到b
        printf("%c-- >%c\n", a, c);
        Swap(n - 1, b, a, c);//把n-1个盘子,最后从b通过a移动到c上
    }
}
int main()
{
    int n;
    scanf_s("%d", &n);
    Swap(n, 'a', 'b', 'c');
    return 0;
}

 

斐波那契数列:

 利用递归实现算法:

long long Ssum(int n)
{	
	int sum;
	if (n == 1 || n == 2)
		return 1;
	else
	{
		sum = Ssum(n - 1) + Ssum(n - 2);
		return sum;
	}
}

利用循环实现算法:

long long Ssum1(int n)
{
	long long n1 = 1;
	long long n2 = 1;
	long long n3 = 1;
	for (int i = 1; i < n; i++)
	{
		n3 = n1 + n2;
		n1 = n2;
		n2 = n3;
	}
	return n3;

递归算法相比循环算法时间复杂度更大,O(n^2和O(n)。

所以斐波那契数列是最不适合递归的例子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值