当前位置:  开发笔记 > 编程语言 > 正文

如何根据条件求和斐波纳契数?

如何解决《如何根据条件求和斐波纳契数?》经验,为你挑选了1个好方法。

我试图根据条件求和斐波纳契数.假设我有我的功能:

def findingSum(lower: Int, upper: Int): Int{}

它通过2个数字.如果我通过findingSum(20 , 90),我的函数应该找到这些数字之间的斐波纳契数的总和,换句话说,我应该得到21 + 34 + 55 + 89的总和.

码:

def  findingSum(lower: Int, upper: Int): Int = {
    var sum=0;
    var current 
    var prev = 1
    var prevprev = 0

    for(i <- (n.length-1))          
    {
        current = prev + prevprev;        
        sum += current;
        prevprev = prev;                 
        prev = current;                   
    }               
    println("Result= " + sum);
}

jwvh.. 8

首先,您创建一个Fibonacci流.

def fib: Stream[Int] = 0 #:: fib.scan(1)(_+_)

然后你拿走,掉落,总结.(或者丢弃,拿走,并且总结.它可以以任何方式工作.)

fib.takeWhile(_ <= upper).dropWhile(_ <= lower).sum

将Fibonacci数字保存在Stream这样的一个优点是计算被缓存.一旦计算出第10个Fibonacci数(55),就不需要重新计算,这是一个简单的查找fib(10).

所以,把它放在上下文中:

def findingSum(lower: Int, upper: Int): Int = {
  def fib: Stream[Int] = 0 #:: fib.scan(1)(_+_)
  fib.takeWhile(_ <= upper).dropWhile(_ <= lower).sum
}

但是这种安排确实消除了我之前提到的很好的缓存,因此fib在函数之外的某处定义它可能是有意义的,这样它就不会在每次调用时重新定义.我可能会选择以下内容:

def fib: Stream[Int] = 0 #:: fib.scan(1)(_+_)
def findingSum(l: Int, u: Int) = fib.takeWhile(_ <= u).dropWhile(_ <= l).sum

更正

有关Stream缓存的信息来自此处,其中指出:

...一个Stream是一个List,它的尾巴是一个懒惰的val.计算完成后,值将保持计算并重复使用.

但是,稍后在同一页面上它也会说Streams:

...主要好处是编写无限序列(特别是递归定义的序列).但是,可以避免将所有Stream保留在内存中,方法是确保不保留对其头部的引用(例如,通过使用def而不是val来定义Stream).

因此,虽然我对Stream缓存没有错,但我的代码示例却未能真正利用它.

替换def fib: Stream...//etc.lazy val fib: Stream...//etc.,我认为我们很好.



1> jwvh..:

首先,您创建一个Fibonacci流.

def fib: Stream[Int] = 0 #:: fib.scan(1)(_+_)

然后你拿走,掉落,总结.(或者丢弃,拿走,并且总结.它可以以任何方式工作.)

fib.takeWhile(_ <= upper).dropWhile(_ <= lower).sum

将Fibonacci数字保存在Stream这样的一个优点是计算被缓存.一旦计算出第10个Fibonacci数(55),就不需要重新计算,这是一个简单的查找fib(10).

所以,把它放在上下文中:

def findingSum(lower: Int, upper: Int): Int = {
  def fib: Stream[Int] = 0 #:: fib.scan(1)(_+_)
  fib.takeWhile(_ <= upper).dropWhile(_ <= lower).sum
}

但是这种安排确实消除了我之前提到的很好的缓存,因此fib在函数之外的某处定义它可能是有意义的,这样它就不会在每次调用时重新定义.我可能会选择以下内容:

def fib: Stream[Int] = 0 #:: fib.scan(1)(_+_)
def findingSum(l: Int, u: Int) = fib.takeWhile(_ <= u).dropWhile(_ <= l).sum

更正

有关Stream缓存的信息来自此处,其中指出:

...一个Stream是一个List,它的尾巴是一个懒惰的val.计算完成后,值将保持计算并重复使用.

但是,稍后在同一页面上它也会说Streams:

...主要好处是编写无限序列(特别是递归定义的序列).但是,可以避免将所有Stream保留在内存中,方法是确保不保留对其头部的引用(例如,通过使用def而不是val来定义Stream).

因此,虽然我对Stream缓存没有错,但我的代码示例却未能真正利用它.

替换def fib: Stream...//etc.lazy val fib: Stream...//etc.,我认为我们很好.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有