Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala模式匹配-变量_Scala_Pattern Matching - Fatal编程技术网

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,它“功能性较差”,但它回答了如何在模式匹配范围内定义变量的问题。