`
chenjingbo
  • 浏览: 460657 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

函数式编程学习1 一个斐波那契数列计算引来的思维变化

 
阅读更多

第一种写法

def fib(n:Int):Int = {
  def loop(i:Int):Int = {
    i match {
      case 1 => 0
      case 2 => 1
      case _ => loop(i - 1) + loop(i - 2)
    }
    
  }
  loop(n)
}

     相信有一定的编程能力的人,写这么一个递归函数应该不难,也是与人的思维最相近的,但是很明显,两层递归对栈的消耗完全是指数级的,写完这个,后续一定会考虑如何优化. 尾递归优化是针对递归非常常用的优化方式,那么问题来了,如何对上述的代码进行可以尾递归的改造. 通常的做法也容易想,就是递归方法中存放中间结果.那么下一个版本的代码如下

 

第二种写法

def fib2(n:Int):Int = {
  @annotation.tailrec
  def loop(n:Int,pre:Int,current:Int):Int={
    if(n == 1){
      pre
    } else {
      loop(n-1,current,current+pre)
    }
  }
  loop(n,0,1)
}

 数组从0,1 开始,然后一共走N位,最后走到1的时候,就是pre的值. 

 

第三种写法

def fib3(n:Int):Int = {
  def loop(first:Int,second:Int):Stream[Int] = first #:: loop(second,first+second)
  
  loop(0,1).take(n).last
}

 

这个是用了scala里非常典型的stream ,这样的话,可以说既与一般人的思维方式相匹配,又避免了栈依赖过多的问题. 

 

 

总结

总体的感觉还是不到位,后续如果思维更加清晰了,再补充一下吧. 

 

分享到:
评论

相关推荐

    Fibonacci数列斐波那契数列PPT学习教案.pptx

    "Fibonacci数列斐波那契数列PPT学习教案.pptx" Fibonacci数列是一种非常重要的数学概念,它的应用非常广泛,包括生物学、经济学、计算机科学等领域。下面我们将详细介绍Fibonacci数列的概念、性质和应用。 1. ...

    Fibonacci数列(非递归的函数调用)

    斐波那契数列是一个经典的数学概念,在计算机科学中经常被用作算法示例和问题解决的工具。这个数列的定义是这样的:第一项F0等于0,第二项F1等于1,从第三项开始,每一项都等于前两项之和。即Fn = Fn-1 + Fn-2 (n >=...

    利用Matlab程序计算斐波那契数列的前一百项

    斐波那契数列是一个经典的数学概念,由意大利数学家斐波那契在13世纪提出,数列中的每一项都是前两项之和。在数列的开始,第一项是0,第二项是1,之后的每一项都等于前两项之和。斐波那契数列的前几项通常是:0, 1, ...

    Python实现斐波那契数列

    程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…… 在数学上,费波那契数列是以递归的方法来定义: F0 = 0 (n=0) F1 = 1 (n=1) Fn ...

    编写函数f,功能是用递归的方法求斐波那契数列的第n项

    【问题描述】编写函数f,功能是用递归的方法求斐波那契数列的第n项,函数原型为 int f(int n),在主函数中输入一个正整数n,调用函数f求出斐波那契数列的第n项,并在主函数中输出。 斐波那契数列:1,1,2,3,5,8,13,...

    java实现Fibonacci数列

    根据给定文件的信息,我们可以详细地探讨如何使用Java来实现Fibonacci数列,并通过具体的代码示例来深入了解这...通过学习这两种方法,我们可以更好地理解和掌握Fibonacci数列的相关知识,并将其应用于实际编程项目中。

    C语言解答经典的数学问题兔子繁衍问题即斐波那契数列问题

    斐波那契数列是数学中一个广为人知的序列,它的每一项都是前两项的和,其定义如下:F(1) = 1, F(2) = 1, 而对于n > 2时,F(n) = F(n-1) + F(n-2)。这个数列不仅在数学上具有重要意义,还在计算机科学中扮演了重要的...

    Labview实现递归:斐波那契数列

    在数学上它以递归的方式进行定义,指这样的一个数列:0、1、1、2、3、5、8、13、21、34、55、89、144……,即前两个数为分别为0和1,从第3项开始,每项的值都等于其前两项之和。斐波那契数列Fib(n)用公式表示为: ...

    Fibonacci(斐波那契)数列的JAVA解法

    下面是一个使用递归算法计算斐波那契数列的JAVA代码: public class Fib_ra{ public static int fibonacci(int n){ if(n>=0) if(n==0||n==1) return n; else return fibonacci(n-2)+fibonacci(n-1); return -1; } ...

    android Handler子线程计算斐波那契数列

    斐波那契数列是一个经典的数学概念,其定义如下:第一项和第二项都是1,从第三项开始,每一项都等于前两项之和。用公式表示就是F(n) = F(n-1) + F(n-2),其中F(1) = 1,F(2) = 1。 在Android中,由于主线程负责处理...

    两种方法计算斐波那契数列

    本文档提供了两种计算斐波那契的C++代码函数,供网友使用,。主要讲cpp添加到新建项目中运行

    递归方法实现斐波那契数列_递归方法实现斐波那契数列_python_源码

    在这个场景下,我们可以编写一个函数,它会根据斐波那契数列的定义来计算第n项的值。 Python中递归实现斐波那契数列的基本代码如下: ```python def fibonacci(n): if n print("输入错误,n应大于0") elif n =...

    java代码实现斐波那契数列输出第n个数

    在Java开发工程师的笔试中,斐波那契数列是一个常见的题目,因为它可以考察候选人的逻辑思维、递归理解以及优化算法的能力。此外,斐波那契数列也常被用来讨论递归与迭代的效率差异,以及如何使用缓存或记忆化技术来...

    (新课标)2020年高考数学 题型全归纳 斐波那契数列.doc

    斐波那契数列,又称为兔子数列,是由13世纪意大利数学家斐波那契提出的一个数学序列。这个数列的特点是每一项都等于前两项之和,起始的两项为1。具体地,斐波那契数列可以用递归公式表示:F0 = 1, F1 = 1, Fn = Fn-1...

    斐波那契数列-C++代码

    本代码使用C++语言书写,编译环境VS2013。...斐波那契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、…… 本代码是练习作品,如有错误或修改,请指正,感谢感谢。

    MIPS汇编实验:斐波那契数列

    斐波那契数列是由两个前一个数相加得到的数列,通常以0和1开始。 首先,我们看C语言部分。`fib`函数接收一个整数`N`,并返回一个整型数组,数组包含了从0到`N`的斐波那契数列。在函数内部,首先进行了输入检测,...

    Fibonacci_VERILOGfibonacci_实现斐波拉切数列_

    在计算机科学中,特别是硬件描述语言(HDL)如Verilog中,斐波那契数列的实现是一个常见的练习,用于学习和展示并行和串行计算的概念。 Verilog是一种广泛使用的硬件描述语言,它允许工程师用类似于编程语言的方式...

    利用递归函数求解Fibonacci数列

    利用递归数列求解著名的Fibonacci数列的各项,用户可自定义输入要求的第n项,输入后即可求出从0到n每一项Fibonacci的值。

    斐波那契数列.pdf

    斐波那契数列(Fibonacci sequence)是数学中一个非常著名的数列,其特点是每一项数值都是前两项数值的和。通常情况下,斐波那契数列的第一项为0或1,第二项也为1,后续各项则根据定义递推得到。 **基本形式:** \...

Global site tag (gtag.js) - Google Analytics