scala程序没有终止

时间:2014-11-19 03:14:10

标签: scala loops

所以我将我的所有代码从Java中的项目euler问题重写成Scala到目前为止成功了,但这个只是给了我一个永无止境的循环并最终占用了我所有的记忆......这是问题7,这里是代码

object Problem7 {
  def primes(current: Int, divisor: Int, count: Int, n: Int): Int = {
    if(divisor>current/2){
    if(count==n)current else primes(n+2, 2, count+1, n)
    }
    if(n%divisor==0) primes(n+1,2,count, n) else primes(n, divisor+1,count, n)
  }
  primes(2, 2, 1, 100)
}

我尝试在第一个else语句之后输入println语句,看它是否到达那里,它确实如此。该程序产生大量素数,但由于某种原因,它从未认为计数等于当前。谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

我假设您了解Java并且正在尝试学习scala。如果是这样,那么尝试以更多功能的方式编写代码。 编写许多小函数来分解工作。停止使用那些沿着命令式编程路径的if语句。这就是函数式编程的全部要点。您应该能够轻松地使用该程序进行推理,并且不会因错放if else语句而出错。

这是一个更实用的方法来帮助您入门


def isFactor(num: Int, divisor: Int) = num % divisor == 0
def isPrime(num: Int) = num % 2 !=0 && ((3 until num by 2) forall(divisor => !isFactor(num, divisor)))
val primes: Stream[Int] = 2 #:: Stream.from(3).filter(isPrime)
def findNPrime(n: Int) = primes take n last
println(findNPrime(10001))

这在3秒内工作,几乎没有优化。通过一些优化,您可以获得更好的性能,代码仍然更整洁

答案 1 :(得分:1)

第一个if语句没有其他语句,这意味着它只被评估副作用(这里没有副作用)所以这可能是一个错误,它应该有一个别的。

总是达到最后一个if表达式,并且总是对素数进行递归调用,因此永远不会终止。

可能你希望最后一个if语句在第一个if语句的else中。