一般递归实现 :

  1. //经典递归
  2. function fibonacci(n) {
  3. return (function(n) {
  4. if (n == 1 || n == 2)
  5. return 1;
  6. return arguments.callee(n - 1) + arguments.callee(n - 2);
  7. })(n);
  8. }

或者:

function fibonacci(n){

  if(n<2)

  return n;

  else

    return fibonacci(n-1)+fibonacci(n-2);

}

尾递归实现:

  1. //尾递归
  2. function fibonacci(n){
  3. return (function(n1, n2, i){
  4. return (i < n) ? arguments.callee(n2, n1+n2, i+1) : n1;
  5. })(1,1,1);
  6. }

跟这样的迭代方法是完全等价的:

  1. //等价的循环
  2. function fibonacci(n){
  3. var n1 = n2 = s = i = 1;
  4. for(; i<n; i++){
  5. s = n1 + n2;
  6. n1 = n2;
  7. n2 = s;
  8. }
  9. return n1;
  10. }

C# 版:

传统的递归方式如下:

public static int FibonacciRecursively(int n)
{
if (n < 2) return n;
return FibonacciRecursively(n - 1) + FibonacciRecursively(n - 2);
}

而改造成尾递归,我们则需要提供两个累加器:

public static int FibonacciTailRecursively(int n, int acc1, int acc2)
{
if (n == 0) return acc1;
return FibonacciTailRecursively(n - 1, acc2, acc1 + acc2);
}

裴波那契数列 JavaScript 尾递归实现的更多相关文章

  1. 剑指offer例题——裴波那契数列

    编程题:大家都知道裴波那契数列,现在要求输入一个整数n,请你输出裴波那契数列的第n项(从0开始,第0项为0).n<=39 public class Solution { public int F ...

  2. 浅谈矩阵加速——以时间复杂度为O(log n)的算法实现裴波那契数列第n项及前n之和使用矩阵加速法的优化求法

    首先请连矩阵乘法乘法都还没有了解的同学简单看一下这篇博客: https://blog.csdn.net/weixin_44049566/article/details/88945949 首先直接暴力求 ...

  3. [矩阵乘法]裴波拉契数列III

    [ 矩 阵 乘 法 ] 裴 波 拉 契 数 列 I I I [矩阵乘法]裴波拉契数列III [矩阵乘法]裴波拉契数列III Description 求数列f[n]=f[n-1]+f[n-2]+1的第N ...

  4. [矩阵乘法]裴波拉契数列II

    [ 矩 阵 乘 法 ] 裴 波 拉 契 数 列 I I [矩阵乘法]裴波拉契数列II [矩阵乘法]裴波拉契数列II Description 形如 1 1 2 3 5 8 13 21 34 55 89 ...

  5. 剑指Offer之裴波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1). n<=39 解法1:递归解法 public int Fibonacc ...

  6. 斐波那契数列 递归 尾递归 递推 C++实现

    ==================================声明================================== 本文原创,转载请注明作者和出处,并保证文章的完整性(包括本 ...

  7. python实现裴波那契数列

    def Fib(n): ''' 假定序号为0或者1,返回1,序号为2时返回2 ''' before = 1 after = 1 for i in range(n): before, after = a ...

  8. Python小代码_11_生成小于 n 的裴波那契数列

    def fib(n): a, b = 1, 1 while a < n: print(a, end=' ') a, b = b, a + b fib(100000) #输出结果 #1 1 2 3 ...

  9. 2.裴波那契(Fibonacci)数列

    裴波那契(Fibonacci)数列 f(n)= ⎧⎩⎨0,1,f(n−1)+f(n−2),n =0n =1n>1 求裴波那契数列的第n项.(题目来自剑指offer) 1.递归解法,效率很低的解法 ...

随机推荐

  1. 实战 SQL Server 2008 数据库误删除数据的恢复

    SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可.但是,这个恢复需要有两个前提条件: 1. 至少有一个误删除之前的数据库完全备份. 2. 数据库的恢复模式(Recovery m ...

  2. JS 之性能优化(1)

    了解JS性能优化是学习前端必备的一项技能.下面就简单的列出几点: 1.注意作用域,避免全局查找. 访问全局变量比访问局部变量慢,是因为需要遍历作用域链,查找作用域链需要额外的时间.所以在一个函数中,将 ...

  3. Android nDrawer

    GitHub上一款流行的侧滑,附上自己as编译过的源码http://download.csdn.net/detail/lj419855402/8559039. 留个纪念,说不定以后用得到. 依赖一个l ...

  4. 学习Shell脚本编程(第5期)_表达式的比较

    字符串操作符 逻辑运算符 用test比较的运算符 数字比较符 文件操作符 在Shell程序中,通常使用表达式比较来完成逻辑任务.表达式所代表的操作符有字符操作符.数字操作符.逻辑操作符.以及文件操作符 ...

  5. diff: /../Podfile.lock: No such file or directory

    从github上下载源码运行会报错:问题1描述: diff: /../Podfile.lock: No such file or directory diff: /Manifest.lock: No ...

  6. Linux下线程池的理解与简单实现

    首先,线程池是什么?顾名思义,就是把一堆开辟好的线程放在一个池子里统一管理,就是一个线程池. 其次,为什么要用线程池,难道来一个请求给它申请一个线程,请求处理完了释放线程不行么?也行,但是如果创建线程 ...

  7. DELL VENUE 11 PRO系统损坏之后的解决办法

    首页说明下我的平板是dell venue 11 pro atom版+win8.1版. 前两天测试玩win10,结果后来几天这货直接开不了机了,每次提示自动修复,但是却说找不到某一文件,然后蓝屏,win ...

  8. C/C++指针内存分配小细节

    char *pc = NULL; pc = new char[0]; pc[0] = '1'; 相信初学者看见上面这段代码,都会觉得奇怪,new char[n]中的n指定给指针变量分配多少内存空间,而 ...

  9. java文件中文在MyEclipse中打开变成了乱码

    导入其他人的项目,出现乱码状况 以下是解决方案之一:

  10. JavaScript事件冒泡简介及应用

    一.什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事 件处理程序或者事件返回true,那么这个 ...