1.递归与迭代:
①求n的阶乘(不考虑溢出):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int factorial(int a)
{
if (a <= 1)
return 1;
else
return a * factorial(a - 1);
}
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", factorial(n));
return 0;
}
②求第n个斐波那契数(不考虑溢出):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Fib(int a)
{
if (a <= 2)
return 1;
else
return Fib(a - 1) + Fib(a - 2);
}
int main()
{
int n;
scanf("%d", &n);
printf("第n个斐波那契数列为>: %d\n",Fib(n));
return 0;
}
正常来说,采用这样的递归思想来实现计算是可行的,但是效率太低了。
当想要求出第50个斐波那契数的大小时已经溢出无法计算了。
由上图可以直观地看到当我们要计算第50个斐波那契数的时候,往下拆分,
会发现有很多数被重复计算了,这无疑会产生极大的资源浪费。
那么我们该如何优化呢?
为避免出现重复的情况,那我们可以将每次计算的结果保留,
下图思路就是如此,第一个数字1赋值给a,第二个数字1赋值给b,
再用a+b算出c(第三个斐波那契数),或者直接给c赋值上2.
算出c后,把b赋值给a,c再赋值给b,接着算出c(第四个斐波那契数)
如此循环,想象成abc就是一组滑块,顺着往下一一对应。
按照这样一个思路,我们不难写出如下优化后的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Fib(int x)
{
int a = 1;
int b = 1;
int c = 1;
while (x > 2)
{
c = a + b;
a = b;
b = c;
x--;
}
return c;
}
int main()
{
int n;
scanf("%d", &n);
printf("第n个斐波那契数为>: %d\n", Fib(n));
return 0;
}