像 Python 生成器一样编写 Scala 迭代递归
write Scala iterative recursion like Python generator
我可以使用生成器轻松编写 return 迭代器在 Python 中的递归。
喜欢这个字符串的置换函数:
def permute(string):
if len(string)==1:
yield string
else:
for i in range(len(string)):
for p in permute(string[:i]+string[i+1:]):
yield string[i]+p
如何将其翻译成 Scala 版本。
Scala 的 iterator
可以在这里工作吗,还是我们真的需要求助于 continuation
(从未使用过,只是听说过)?
您可以使用 Stream
获得非常相似的效果:
def permute[T](list: List[T]): Stream[List[T]] =
if (list.size == 1) Stream(list)
else for {
i <- Stream.range(0, list.size)
l <- list splitAt i match {
case (left, el :: right) => permute(left ::: right) map (el :: _)
}
} yield l
它适用于长序列的排列。例如,从第 10000 个排列开始,为 100 个元素的 10 个排列打印最后 10 个元素:
scala> permute(1 to 100 toList) slice (10000, 10010) foreach {
lst => println(lst.takeRight(10)) }
List(91, 92, 94, 100, 99, 95, 97, 98, 93, 96)
List(91, 92, 94, 100, 99, 95, 97, 98, 96, 93)
List(91, 92, 94, 100, 99, 95, 98, 93, 96, 97)
List(91, 92, 94, 100, 99, 95, 98, 93, 97, 96)
List(91, 92, 94, 100, 99, 95, 98, 96, 93, 97)
List(91, 92, 94, 100, 99, 95, 98, 96, 97, 93)
List(91, 92, 94, 100, 99, 95, 98, 97, 93, 96)
List(91, 92, 94, 100, 99, 95, 98, 97, 96, 93)
List(91, 92, 94, 100, 99, 96, 93, 95, 97, 98)
List(91, 92, 94, 100, 99, 96, 93, 95, 98, 97)
我可以使用生成器轻松编写 return 迭代器在 Python 中的递归。
喜欢这个字符串的置换函数:
def permute(string):
if len(string)==1:
yield string
else:
for i in range(len(string)):
for p in permute(string[:i]+string[i+1:]):
yield string[i]+p
如何将其翻译成 Scala 版本。
Scala 的 iterator
可以在这里工作吗,还是我们真的需要求助于 continuation
(从未使用过,只是听说过)?
您可以使用 Stream
获得非常相似的效果:
def permute[T](list: List[T]): Stream[List[T]] =
if (list.size == 1) Stream(list)
else for {
i <- Stream.range(0, list.size)
l <- list splitAt i match {
case (left, el :: right) => permute(left ::: right) map (el :: _)
}
} yield l
它适用于长序列的排列。例如,从第 10000 个排列开始,为 100 个元素的 10 个排列打印最后 10 个元素:
scala> permute(1 to 100 toList) slice (10000, 10010) foreach {
lst => println(lst.takeRight(10)) }
List(91, 92, 94, 100, 99, 95, 97, 98, 93, 96)
List(91, 92, 94, 100, 99, 95, 97, 98, 96, 93)
List(91, 92, 94, 100, 99, 95, 98, 93, 96, 97)
List(91, 92, 94, 100, 99, 95, 98, 93, 97, 96)
List(91, 92, 94, 100, 99, 95, 98, 96, 93, 97)
List(91, 92, 94, 100, 99, 95, 98, 96, 97, 93)
List(91, 92, 94, 100, 99, 95, 98, 97, 93, 96)
List(91, 92, 94, 100, 99, 95, 98, 97, 96, 93)
List(91, 92, 94, 100, 99, 96, 93, 95, 97, 98)
List(91, 92, 94, 100, 99, 96, 93, 95, 98, 97)