用递归的方式求斐波那契数列的第n个数。
用非递归的方式求斐波那契数列的第n个数。
定义:
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368
特别指出:第0项是0,第1项是第一个1。
这个数列从第2项开始,每一项都等于前两项之和。
#include<stdio.h> #include<stdlib.h> #include<cmath> int FibonacciRecursion(int a, int b, const int n) { //存在n对应的一项可能超出 %d 所表示的整数范围 int count = n; if (0 == count) return a; else { if (a + b > 0) return FibonacciRecursion(b, a + b, --count);//传入的a+b必须大于0 else return -1; } } int FibonacciNonrecursionFormula(int const n)//非递归公式法(double与int转换时有误差) { int count =(int) 1.0 / sqrt(5)*(pow((1.0 + sqrt(5)) / 2.0, n) - pow((1.0 - sqrt(5)) / 2, n)); return count < 0 ? -1 : count; } int FibonacciNonrecursion(int const n)//非递归非公式法 { int count = n; int a = 0; int b = 1; int tmp = a; if (0 == n) return a; if (1 == n) return b; else { while (count--) { tmp = a; a = b; b = a + tmp; if (a < 0) return -1; } return a; } } int main() { int n = 0; while (n++<88) { if (FibonacciRecursion(0, 1, n) != FibonacciNonrecursionFormula(n) || FibonacciNonrecursion(n) != FibonacciNonrecursionFormula(n)) { printf("Fibonacci 数列第 %d 项为:%d - %d\n", n, FibonacciRecursion(0, 1, n), FibonacciNonrecursionFormula(n)); printf(" 第 %d 项为:%d\n", n, FibonacciNonrecursion(n)); } } printf("%d\n", 2836311903);//45项+46项 < 2836311903 所以在46以后大于0x7fffffff system("pause"); return 0; }
时间: 2024-10-17 16:03:12