尾递归实现斐波那契数列

一、斐波那契数列

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368......

二、递归算法

1. 代码

public int fib(int n){
      if(n==1 || n==2){
            return 1;
      }

      return fib(n-1)+fib(n-2);
}

2. 缺点:多次计算重复的fib(n),性能低,一般只用于说明递归算法

三、改进:空间换时间,把计算出来的fib(n)存储起来,不用重复计算,空间复杂度O(n)

public int fib(int n){
       int[] array=new int[n];
       array[0]=1;
       array[1]=1;

       for(int i=2;i<n;i++){
           array[i]=array[i-1]+array[i-2];
        }

       return array[n-1];
}

四、再次改进,空间减少到O(1),只存储3个数:前两个数和前两个数相加计算出来的结果

public int fib(int n){
       int first=1;
       int second=2;
       int third=3;

       for(int i=3;i<=n;i++){
           third=first+second;
           first=second;
           second=third;
       }

       return third;
}

五、尾递归

public int fib(int n,int first,int second){
      if(n<=1){
          return first;
      }

      rerurn fib(n-1,second,first+second);
}

参考:

https://www.cnblogs.com/andy-songwei/p/11707142.html

原文地址:https://www.cnblogs.com/june0816/p/6265623.html

时间: 2024-10-19 21:36:22

尾递归实现斐波那契数列的相关文章

尾递归 - 以斐波那契数列为例说明

尾递归 前言:今天上网看帖子的时候,看到关于尾递归的应用(http://bbs.csdn.net/topics/390215312),大脑中感觉这个词好像在哪里见过,但是又想不起来具体是怎么回事.如是乎,在网上搜了一下,顿时豁然开朗,知道尾递归是怎么回事了.下面就递归与尾递归进行总结,以方便日后在工作中使用. 1.递归 关于递归的概念,我们都不陌生.简单的来说递归就是一个函数直接或间接地调用自身,是为直接或间接递归.一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前

递归算法——求取斐波那契数列(2)

import java.util.Scanner; /** * Created by Administrator on 14-5-13. * 改进的计算斐波那契数列的方法,利用参数,经过测试运行时间会成倍减少 测试数据n=40 * 尾递归的本质是:将单次计算的结果缓存起来,传递给下次调用,相当于自动累积. * 尾部递归是一种编程技巧.递归函数是指一些会在函数内调用自己的函数, * 如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归. * 尾部递归的函数有助将算法转化成函数编程语言,

面试官问你斐波那契数列的时候不要高兴得太早

前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了.如果真这么想,那就危险了. 递归求斐波那契数列 递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.斐波那契数列的计算表达式很简单: 1F(n) = n; n = 0,12F(n) = F(n-1) + F(n-2),n >= 2; 因此,我们能很快根据表达式写出递归版的代码: 1/*fibo.c*/ 2#include <stdio.h> 3#include <stdlib.h&

求斐波那契数列第n位的几种实现方式及性能对比(c#语言)

在每一种编程语言里,斐波那契数列的计算方式都是一个经典的话题.它可能有很多种计算方式,例如:递归.迭代.数学公式.哪种算法最容易理解,哪种算法是性能最好的呢? 这里给大家分享一下我对它的研究和总结:下面是几种常见的代码实现方式,以及各自的优缺点.性能对比. Iteration using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; public class Progr

剑指offer系列——7.斐波拉契数列

Q:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 C:时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M A:最简单的就是递归-- int Fibonacci(int n) { if (n == 1 || n == 2) return 1; else if (n == 0) return 0; else { return Fibonacci(n - 1) + Fibonacci(n - 2);

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3

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

《剑指Offer》题目——斐波拉契数列

题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.(n<=39) 题目分析:如果使用简单的递归,很容易造成栈溢出.采用递推的方式即可. 代码: public class Fibonacci { public static int fibonacci(int n){ int res[] = new int[2]; res[0]=1; res[1]=1; int temp = 0; if(n==0) return 0; if(n<=2) return res[

js算法集合(二) javascript实现斐波那契数列 (兔子数列) Javascript实现杨辉三角

js算法集合(二)  斐波那契数列.杨辉三角 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列和杨辉三角进行研究,来加深对Javascript的理解. 一.Javascript实现斐波那契数列 ①要用Javascript实现斐波那契数列,我们首先要了解什么是斐波那契数列:斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为