gpt4 book ai didi

scala - 如何根据条件对斐波那契数求和?

转载 作者:行者123 更新时间:2023-12-01 07:28:48 25 4
gpt4 key购买 nike

我正在尝试根据条件对斐波那契数求和。假设我有我的功能:

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);
}

最佳答案

首先,您创建斐波那契流。

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

然后你取,舍,求和。 (或者删除、获取和求和。无论哪种方式都有效。)

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

像这样将斐波那契数保存在 Stream 中的一个优点是可以缓存计算。一旦计算出第 10 个斐波那契数 (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

更正

关于流缓存的信息来自here ,其中指出:

... a Stream is a List whose tail is a lazy val. Once computed, a value stays computed and is reused.

但是,稍后在同一页面上,它还说明了有关 Streams 的内容:

... main benefit is writing infinite sequences (particularly sequences recursively defined). One can avoid keeping all of the Stream in memory, though, by making sure you don’t keep a reference to its head (for example, by using def instead of val to define the Stream).

因此,尽管我对 Stream 缓存的理解没有错,但我的代码示例未能真正利用它。

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

关于scala - 如何根据条件对斐波那契数求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35213438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com