scala模式匹配 - 变量

Ram*_*amy 1 scala pattern-matching

当我读这篇文章时(第14页),我遇到了这个算法:

function fib2(n)
    if n = 0 return 0
    create an array f[0 : : : n]
    f[0] = 0, f[1] = 1
    for i = 2 : : : n:
        f[i] = f[i  1] + f[i  2]
    return f[n]
Run Code Online (Sandbox Code Playgroud)

如果我想使用模式匹配在Scala中实现它,有没有办法在模式匹配部分创建一个List,以便在最终的return语句中使用它?

这些都是很好的答案,但我想我还是想知道是否可以定义一个只在模式匹配中使用的变量.我知道你可以在Haskell中做到这一点,但我想知道它是否在Scala中可行.

jil*_*len 13

lazy val fib: Stream[Int] = Stream.cons(0,Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2)))
Run Code Online (Sandbox Code Playgroud)

fib.take(n).last将返回结果
另一个基于流的解决方案.它定义了无限的斐波纳契数列.是的,它是救援和无限定义,但所有计算都是在调用take时执行的.
在此输入图像描述 只需在这里查看更多有趣的代码. 链接


Kip*_*ros 10

我不认为这里需要模式匹配.对Scala的直接转换看起来基本相同:创建一个数组f并循环索引2 until n.

def fib(n: Int): Array[Int] = {
  val f = new Array[Int](math.max(2, n))
  f(0) = 0
  f(1) = 1
  for (i <- 2 until n)
    f(i) = f(i-1) + f(i-2)
  f
}
Run Code Online (Sandbox Code Playgroud)

如果你想变得更漂亮,懒惰的流怎么样?

def fibFrom(a: Int, b: Int): Stream[Int] = a #:: fibFrom(b, a + b)
fibFrom(0, 1).take(8).toList // returns List(0, 1, 1, 2, 3, 5, 8, 13)
Run Code Online (Sandbox Code Playgroud)