汉诺塔问题:古代有一个梵塔,塔内有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)。
所以斐波那契数列是最不适合递归的例子。