scala模式匹配-变量
当我阅读时,我遇到了这个算法:scala模式匹配-变量,scala,pattern-matching,Scala,Pattern Matching,当我阅读时,我遇到了这个算法: 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] 如果我想在Scala中使用模式匹配实现这一点,有没有办法在模式匹配部分创建一个列表,以便在最终返回语句中使用它 这些都是很好的答案,
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]
如果我想在Scala中使用模式匹配实现这一点,有没有办法在模式匹配部分创建一个列表,以便在最终返回语句中使用它
这些都是很好的答案,但我想我还是想知道,是否有可能定义一个只在模式匹配中使用的变量。我知道你可以在Haskell中实现,但我想知道它在Scala中是否可行。我认为这里不太需要模式匹配。到Scala的直接转换看起来基本相同:创建一个数组
f
,循环索引2直到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
}
我认为这里不太需要模式匹配。到Scala的直接转换看起来基本相同:创建一个数组
f
,循环索引2直到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
}
我认为使用惰性流是更好的方法,但只是为了锻炼我的肌肉:
def fib(s:Int):List[Int] = s match {
case 0 => Nil
case 1 => 0::fib(s-1)
case 2 => 0::1::fib(s-2)
case _ => fib(s-1):::fib(s-1).takeRight(2).sum::Nil
}
我认为使用惰性流是更好的方法,但只是为了锻炼我的肌肉:
def fib(s:Int):List[Int] = s match {
case 0 => Nil
case 1 => 0::fib(s-1)
case 2 => 0::1::fib(s-2)
case _ => fib(s-1):::fib(s-1).takeRight(2).sum::Nil
}
fib.take(n)。last将返回结果另一个基于流的解决方案。它定义了一个无限的斐波那契序列。是的,它是rescue和infinite definition,但所有计算都是在调用take时执行的。
只需在这里查看更有趣的代码。 fib.take(n)。last将返回结果
另一个基于流的解决方案。它定义了一个无限的斐波那契序列。是的,它是rescue和infinite definition,但所有计算都是在调用take时执行的。
只需在这里查看更有趣的代码。
这里是对jeela解决方案的重构。我认为总是用头工作比较好,因为它要快得多。最后的
倒转没有多大伤害
def fib(s:Int) = {
def f(s:Int):List[Int] = s match {
case x if x < 0 => Nil
case 0 => List(0)
case 1 => List(1,0)
case _ => val fibs = f(s-1); (fibs.head + fibs.tail.head) :: fibs
}
f(s).reverse
}
def fib(s:Int)={
定义f(s:Int):列表[Int]=s匹配{
如果x<0=>Nil,情况x
案例0=>列表(0)
案例1=>列表(1,0)
案例=>valfibs=f(s-1);(fibs.head+fibs.tail.head)::fibs
}
f(s).反向
}
这里是对jeela解决方案的重构。我认为总是用头工作比较好,因为它要快得多。最后的倒转没有多大伤害
def fib(s:Int) = {
def f(s:Int):List[Int] = s match {
case x if x < 0 => Nil
case 0 => List(0)
case 1 => List(1,0)
case _ => val fibs = f(s-1); (fibs.head + fibs.tail.head) :: fibs
}
f(s).reverse
}
def fib(s:Int)={
定义f(s:Int):列表[Int]=s匹配{
如果x<0=>Nil,情况x
案例0=>列表(0)
案例1=>列表(1,0)
案例=>valfibs=f(s-1);(fibs.head+fibs.tail.head)::fibs
}
f(s).反向
}
+1获得一个很好的答案。你能为n00b分解一下吗?我不清楚fib.zip(和fib.tail)部分。@Ramy在REPL:val s=Seq(1,2,3)处尝试一下;println(s.tail);println(s-zip s.tail)
+1获得一个很好的答案。你能为n00b分解一下吗?我不清楚fib.zip(和fib.tail)部分。@Ramy在REPL:val s=Seq(1,2,3)处尝试一下;println(s.tail);println(s zip s.tail)
这实际上就是我要找的val fibs=f(s-1);(fibs.head+fibs.tail.head)::fibs
我认为它因为val而“功能性较差”,但它回答了如何在模式匹配范围内定义变量的问题。事实上,这就是我要寻找的val fibs=f(s-1);(fibs.head+fibs.tail.head)::fibs
我认为由于val,它“功能性较差”,但它回答了如何在模式匹配范围内定义变量的问题。