Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间

#include <stdio.h>
int fib(int n)
{

if (n<=1)     return 1;
else            return fib(n-1)+fib(n-2);
}
int main( )
{
int n;
scanf("%d",&n);
printf("%d\n" ,fib(n) );
}

先 n==10 20 30 40 50 46 体验一下,感受一下,运行时间

再    提交一下zjut 1029 超时

// Time Limited Exceeded

#include <stdio.h>
int fib(int n)
{

if (n<=1) return 1;
else return fib(n-1)+fib(n-2);
}
int main( )
{
int n;
while(scanf("%d",&n))
printf("%d\n" ,fib(n) );
}

 普通递归

由上向下,,由大的 算小的

纯递推

 //Accept

#include <stdio.h>
int fib[50]={0,1}; //使用打表
void init()
{
int i;
for(i=2;i<50;i++) //纯递推 for循环
fib[i]=fib[i-1]+fib[i-2]; // 由上到下 因为大的 算小的
}

int main( )
{
int n;
init();
while(scanf("%d",&n))
printf("%d\n" ,fib[n] );
}

 记忆式搜索

递归计算之前,判断前面是否计算过

有小的(数组---保存起来)推大的

 //Accept
#include <stdio.h> // 记忆式搜索
int a[50]={0,1};
int fib(int n)
{
if(n<=2)              return a[n]=1;             // 1赋值给 a[n]                           //return   1;

else if(a[n]==0)   return a[n]=fib(n-1)+fib(n-2);             //没有算   先算 右边fib(n-1)+fib(n-2)          ,,在保存 a[n]
else return a[n];                                     // 否则就  算过了,,,直接用它a[n]

}

int main( )
{
int n;

while(scanf("%d",&n)!=EOF)
printf("%d\n" ,fib(n) );
}

Fibonacci斐波拉契数列----------动态规划DP,布布扣,bubuko.com

时间: 2024-09-29 05:25:29

Fibonacci斐波拉契数列----------动态规划DP的相关文章

【动态规划专题】1:斐波拉契数列问题的递归和动态规划

<程序员代码面试指南--IT名企算法与数据结构题目最优解> 左程云 著 斐波拉契数列问题的递归和动态规划 [题目]:给定整数N,返回斐波拉契数列的第N项.补充问题1:给定整数N,代表台阶数,一次可以跨2个或者1个台阶,返回有多少种走法.补充问题2:假设农场中成熟的母牛每年只会生产1头小母牛,并且永远不会死.第一年农场只有1只成熟的母牛,从第2年开始,母牛开始生产小母牛.每只小母牛3年后成熟又可以生产小母牛.给定整数N,求出N年后牛的数量. [举例]斐波拉契数列f(0)=0, f(1)=1,f(

斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负整数,请设计一个高效算法,计算第n项F(n).第一个斐波拉契数为F(0) = 1. 给定一个非负整数,请返回斐波拉契数列的第n项,为了防止溢出,请将结果Mod 1000000007. 斐波拉契数列的计算是一个非常经典的问题,对于小规模的n,很容易用递归的方式来获取,对于稍微大一点的n,为

浅谈C#中的斐波拉契数列

突然对那些有趣的数学类知识感兴趣了,然后就简单研究了一下斐波拉契数列,看看它的有趣之处! 斐波拉契数列(Fibonacci Sequence),又称黄金分割数列,该数列由意大利的数学家列奥纳多·斐波那契发现的.这种数列指的是这样一个数列:0.1.1.2.3.5.8.13.21. 34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*). 用C#实现斐波拉契数列的代码: Console.Write("请输入一个长

斐波拉契数列的计算方法

面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long Fib(unsigned int n) { if(n<=0) return 0; if(n==1) return 1; return Fib(n-1) + Fib(n-2); } 缺陷: 当n比较大时递归非常慢,因为递归过程中存在很多重复计算. 二.改进思路: 应该采用非递归算法,保存之前的计算结

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 <

斐波拉契数列应用

斐波拉契数列的应用实例 什么是斐波拉契数列(Fibonacci sequence)?将其前几项写出来就是:0 1 1 2 3 5 8 13 21....... 观察不难发现其规律是,从第二项起,每一项的值都为前两项的和.而且这个数列有趣的地方就在于这个非常特殊的规律.它是有通项公式的,但是推导与主题无关,而且也几乎用不上,所以就不多叙述. long fi(int n) { if(n==1||n==2) return 1; else return fi(n-1)+fi(n-2); } 但是如果这样

如何打印斐波拉契数列以及质数列表

这其实是两道非常基础和简单地题.但somehow每隔一段时间我老是会不经意地想起这两个问题,有时候卡克没有一下想起解法还会急的直冒汗................... 言归正传,贴出这两题代码 (1)打印斐波拉契数列 // Java program for Fibonacci number using Loop. public static int fibonacciLoop(int number){ if(number == 1 || number == 2){ return 1; } i

剑指offer-第二章算法之斐波拉契数列(青蛙跳台阶)

递归与循环 递归:在一个函数的内部调用这个函数. 本质:把一个问题分解为两个,或者多个小问题(多个小问题相互重叠的部分,会存在重复的计算) 优点:简洁,易于实现. 缺点:时间和空间消耗严重,如果递归调用的层级太多,就会超出栈容量. 循环:通过设置计算的初始值及终止条件,在一个范围内重复运算. 斐波拉契数列 题目一:写一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项,定义如下: 第一种解法:用递归的算法: long long Fabonacci(unsigned int n) { i

斐波拉契数列、楼梯问题、奶牛问题

斐波拉契数列:波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)[from 百度百科 http://baike.baidu.com/link?url=8LKtKTAllUGDMe610zIO0DAjS3CCeAOpXiCFvH_Y47_I_XDRgzyGcrzsodd1OHO726FJNPWkqzkQC7PIuGu_