gpt4 book ai didi

scala - 进行有关先前计算的信息

转载 作者:行者123 更新时间:2023-12-04 13:53:06 24 4
gpt4 key购买 nike

我是函数编程的新手,因此使用函数方法似乎很难解决一些问题。

假设我有一个数字列表,例如1到10.000,并且我想获取列表中的项,这些项的总和最多为n(比如100)。因此,它将得到这些数字,直到它们的总和大于100。

在命令式编程中,解决此问题很简单,因为我可以在每个交互中保留一个变量,并在达到目标后停止。

但是如何在函数式编程中做同样的事情?由于求和函数在已完成列表上运行,而我仍然没有已完成列表,我该如何“进行”计算?

如果总和是惰性计算的,我可以这样写:

           (1 to 10000).sum.takeWhile(_ < 100)

P.S .:即使有任何答案,我也希望每次都不要计算总和,因为显然命令式版本在速度方面会更加优化。

编辑:

我知道我可以将命令式循环方法“转换”为功能递归函数。我更感兴趣的是寻找现有的库函数之一是否可以为我提供一种方法,使我不需要在每次需要的东西时都编写一个。

最佳答案

使用 Stream

scala> val ss = Stream.from(1).take(10000)
ss: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> ss.scanLeft(0)(_ + _)
res60: scala.collection.immutable.Stream[Int] = Stream(0, ?)

scala> res60.takeWhile(_ < 100).last
res61: Int = 91

编辑:

获取组件也不是很棘手。这是您可以执行的操作:
scala> ss.scanLeft((0, Vector.empty[Int])) { case ((sum, compo), cur) => (sum + cur, compo :+ cur) }
res62: scala.collection.immutable.Stream[(Int, scala.collection.immutable.Vector[Int])] = Stream((0,Vector()), ?)

scala> res62.takeWhile(_._1 < 100).last
res63: (Int, scala.collection.immutable.Vector[Int]) = (91,Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13))

元组的第二部分是您想要的结果。

显而易见,在这种情况下,建立向量是浪费的。相反,我们只能存储贡献总和的流中的最后一个数字。
scala> ss.scanLeft(0)(_ + _).zipWithIndex
res64: scala.collection.immutable.Stream[(Int, Int)] = Stream((0,0), ?)

scala> res64.takeWhile(_._1 < 100).last._2
res65: Int = 13

关于scala - 进行有关先前计算的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10582162/

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