我试图根据条件求和斐波纳契数.假设我有我的功能:
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.
,我认为我们很好.
首先,您创建一个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.
,我认为我们很好.