相关疑难解决方法(0)

如何摆脱Scala中的循环?

我如何打破循环?

var largest=0
for(i<-999 to 1 by -1) {
    for (j<-i to 1 by -1) {
        val product=i*j
        if (largest>product)
            // I want to break out here
        else
           if(product.toString.equals(product.toString.reverse))
              largest=largest max product
    }
}
Run Code Online (Sandbox Code Playgroud)

如何将嵌套for循环转换为尾递归?

来自FOSDEM 2009 上的Scala Talk http://www.slideshare.net/Odersky/fosdem-2009-1013261在第22页:

打破并继续Scala没有它们.为什么?他们有点必要; 更好地使用许多较小的函数问题如何与闭包交互.他们不需要!

解释是什么?

for-loop scala tail-recursion break

267
推荐指数
9
解决办法
18万
查看次数

Scala中方法和函数之间的区别

我阅读了Scala Functions(另一个Scala之旅的一部分).在那篇文章中他说:

方法和功能不是一回事

但他没有解释任何有关它的事情.他想说什么?

methods scala function

244
推荐指数
6
解决办法
7万
查看次数

在Scala中折断或短路折叠

我在Scala中编写了一个简单的深度优先搜索,具有这样的递归函数:

search(labyrinth, path, goal)
Run Code Online (Sandbox Code Playgroud)

迷宫是问题的规范(如图或其他),path是一个列表,它保存到目前为止所采用的路径,目标是目标状态的规范.如果找不到路径,该函数将返回作为List的目标路径和Nil.

该函数扩展,例如找到所有合适的下一个节点(候选),然后必须递归调用自身.

我是这样做的

candidates.foldLeft(Nil){ 
  (solution, next) => 
    if( solution == Nil ) 
      search( labyrinth, next :: path, goal ) 
    else 
      solution 
}
Run Code Online (Sandbox Code Playgroud)

请注意,我省略了一些不必要的细节.到目前为止一切正常.但是一旦在foldLeft调用中找到了解决方案,这个解决方案就会被if语句的else部分复制.有没有办法通过打破foldLeft或使用不同的函数而不是foldLeft来避免这种情况?实际上我可能会写一个版本的foldLeft,它会在我自己返回"not Nil"时中断.但API中有一个吗?

functional-programming scala

8
推荐指数
1
解决办法
3912
查看次数

Stream[Boolean] 中的 foldLeft 提前终止?

我有一个:

val a : Stream[Boolean] = ...
Run Code Online (Sandbox Code Playgroud)

当我按如下方式折叠时

val b = a.foldLeft(false)(_||_)
Run Code Online (Sandbox Code Playgroud)

它会在找到true流中的第一个值时终止吗?如果没有,我该如何做到?

scala

5
推荐指数
1
解决办法
1987
查看次数