求斐波那契数列的第n个数(递归、非递归)

用递归的方式求斐波那契数列的第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-08-02 07:02:03

求斐波那契数列的第n个数(递归、非递归)的相关文章

【c语言】求斐波那契数列的前40个数。特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和

// 求斐波那契数列的前40个数.特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和 #include <stdio.h> int main() { int a = 1; int b = 1; int c,i; printf("%d\t%d\t",a,b); for(i = 3; i <= 40; i++) { c = a + b; printf("%d\t",c); a = b; b = c; } printf("\n&quo

快速求斐波那契数列(矩阵乘法+快速幂)

斐波那契数列 给你一个n:f(n)=f(n-1)+f(n-2) 请求出 f(f(n)),由于结果很大请 对答案 mod 10^9+7; 1<=n<=10^100; 用矩阵乘法+快速幂求斐波那契数列是经典应用: 矩阵公式 C i j=C i k *C k j; 根据递推式 构造2*2矩阵: 原始矩阵 1 0 0 1 矩阵 2 1 1 1 0 原始矩阵与矩阵 2相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数.如果后四位全为0,则输出0,否则 输出后四位去掉前导0,也...就...是...说...输出Fn%10000. 题目说的如此清楚..我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后 去掉前导0.o(╯□╰)o 还有矩阵快速幂的幂是0时要特判. P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶! #include<cstdio> #include<iostream>

c语言:写一个函数,输入n,求斐波拉契数列的第n项(5种方法,层层优化)

写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列:1,1,2,3,5,8...,当n大于等于3时,后一项为前面两项之和. 解:方法1:从斐波拉契数列的函数定义角度编程 #include<stdio.h> int fibonacci(int n) { int num1=1, num2=1, num3=0,i; if (n <= 2) { printf("斐波拉契数列的第%d项为:%d\n",n,num1); } else { for (i = 2; i <

利用矩阵求斐波那契数列

利用矩阵求斐波那契数列 flyfish 2015-8-27 矩阵(matrix)定义 一个m*n的矩阵是一个由m行n列元素排成的矩形阵列.矩阵里的元素可以是数字符号或者数学式. 形如 {acbd} 的数表称为二阶矩阵,它由二行二列组成,其中a,b,c,d称为这个矩阵的元素. 形如 {x1x2} 的有序对称为列向量Column vector 设 A={acbd} X={x1x2} 则 Y={ax1+bx2cx1+dx2} 称为二阶矩阵A与平面向量X的乘积,记为AX=Y 斐波那契(Fibonacci

求斐波那契数列的相邻两项的比值,精确到小数后三位。

未完成,只能假设知道是9和10代入. 代码如下: package zuoye; import java.math.BigDecimal; /* * 求斐波那契数列的相邻两项的比值,精确到小数后三位. * p1,p2,p3......pi,pj,...求pi/pj * 1 1 2 3 5 8 13 * 5/8,8/13,...收敛 */ public class Test { static double feibo(int x){ if(x==1||x==2) return 1; return f

javascript求斐波那契数列

斐波那契数列:1,1,2,3,5,8,.... <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>斐波那契数列</title> <style type="text/css"> html,body{ padding: 0;margin: 0; width: 100%; heig

【poj3070】矩阵乘法求斐波那契数列

[题目描述] 我们知道斐波那契数列0 1 1 2 3 5 8 13…… 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. [分析] 这是我们熟悉的斐波那契数列,原来呢我们是递推求值的嘛,当然这是最水的想法~~可是!这里的n很大诶,有10^9,for一遍肯定是不可以的咯. 于是,我学会了用矩阵乘法求斐波那契数列(貌似是很经典的). 作为初学者的我觉得十分神奇!! 好,我们来看: 我们每次存两个数f[i-1]和f[i-2],

黑马入学基础测试(三)求斐波那契数列第n项,n&lt;30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55

.获得用户的输入 计算      3打印就行了.   这里用到了java.util.Scanner   具体API  我就觉得不常用.解决问题就ok了.注意的是:他们按照流体的方式读取.而不是刻意反复读取 自己写的代码: package com.itheima; import java.util.Scanner; public class Test3 { /** * 3.求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55 * * @author