递归和非递归分别实现求第n个斐波那契数。
非递归实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int Fib(int n) {
if (n == 1 || n == 2)
return 1;
int lest1 = 1;//表示第i-1项
int lest2 = 1;//表示第i-2项
int cur = 0;//表示第i项
for (int i = 3; i <= n; ++i) {
cur = lest2 + lest1;
lest2 = lest1;
lest1 = cur;
}
return cur;
}
int main() {
int n;
printf("请输入一个正整数,表示输出第n个斐波那契数.\n");
scanf("%d", &n);
printf("%d\n", Fib(n));
system("pause");
return 0;
}
递归
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int Fib(int n) {
if (n <= 2)
return 1;
else
return Fib1(n - 1) + Fib1(n - 2);
}
int main() {
int n;
printf("请输入一个正整数,表示输出第n个斐波那契数.\n");
scanf("%d", &n);
printf("%d\n", Fib(n));
system("pause");
return 0;
}
这种递归重复计算次数太多,效率太低.
下面是改进后的递归方法:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int Fib3(int n,int lest1,int lest2) {
int result;
if (n == 1 || n == 2)
return 1;
else
result = Fib3(n - 1, lest2, lest1 + lest2) + lest1;
return result;
}
int main() {
int n;
printf("请输入一个正整数,表示输出第n个斐波那契数.\n");
scanf("%d", &n);
printf("%d\n", Fib3(n,1,1));
system("pause");
return 0;
}
``