相关疑难解决方法(0)

是否有通用的方法来记忆Scala?

我想记住这个:

def fib(n: Int) = if(n <= 1) 1 else fib(n-1) + fib(n-2)
println(fib(100)) // times out
Run Code Online (Sandbox Code Playgroud)

所以我写了这个,这令人惊讶地编译和工作(我很惊讶,因为fib在其声明中引用自己):

case class Memo[A,B](f: A => B) extends (A => B) {
  private val cache = mutable.Map.empty[A, B]
  def apply(x: A) = cache getOrElseUpdate (x, f(x))
}

val fib: Memo[Int, BigInt] = Memo {
  case 0 => 0
  case 1 => 1
  case n => fib(n-1) + fib(n-2) 
}

println(fib(100))     // prints 100th fibonacci number instantly
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在a中声明fib时def,我得到一个编译器错误:

def foo(n: …
Run Code Online (Sandbox Code Playgroud)

scope scala memoization dynamic-programming forward-reference

48
推荐指数
3
解决办法
2万
查看次数

为什么在scala中使用返回一个坏习惯

我正在通过课程中的函数式编程课程进行scala.我注意到自动样式检查器告诉我使用'return'是一个坏习惯.这是为什么?对我而言,似乎使用return会使代码更具可读性,因为任何其他程序员都可以立即看到它以及函数返回的内容.

例如,这是为什么;

def sum(xs: List[Int]): Int = {
    if( xs.length == 0){
      return 0
    }else{
      return xs.head + sum(xs.tail)
    }
}
Run Code Online (Sandbox Code Playgroud)

被认为比这更糟糕;

def sum(xs: List[Int]): Int = {
    if( xs.length == 0){
      0
    }else{
      xs.head + sum(xs.tail)
    }
}
Run Code Online (Sandbox Code Playgroud)

我习惯了javascript,所以这可能是我对此感到不安的原因.不过,任何人都可以明白为什么添加return语句会让我的代码变得更糟吗?如果是这样,为什么语言中有返回声明?

scala code-cleanup

1
推荐指数
2
解决办法
452
查看次数