如果不使用'return'语句,为什么以下代码(斐波纳契数列)的行为会有所不同。我认为我们不需要“返回”。

def nthFibonacci(nth:Int): Option[Int] = {
  @annotation.tailrec
  def go(previousNo:Int, nextNo:Int, currentCount:Int, nth:Int):Option[Int]= {
    if (currentCount == nth) Some(previousNo)
    else go(nextNo,previousNo+nextNo,currentCount+1,nth)
  }

  if (nth<=0) None //invalid argument check
  if (nth==1) Some(0) //first fibonacci
  if (nth == 2) Some(1) //second fibonacci
  go(1,(0+1),2,nth)
}


//对于n = 0,1,我得到了垃圾,而我应该得到None或Some。

nth斐波那契(0)
res0:Option [Int] = Some(1070270178)

nthFibonacci(1)
res1:Option [Int] = Some(-2140540357)

nthFibonacci(2)
res2:Option [Int] = Some(1)

有趣的是,如果我更改代码并添加“ return”,则代码有效!
if(nth 如果(nth == 1)返回Some(0)//第一个斐波那契
if(nth == 2)返回Some(1)//第二斐波那契
go(1,(0 + 1),2,nth)

nthFibonacci (0)
res0: Option[Int] = None

nthFibonacci(1)
res1: Option[Int] = Some(0)

nthFibonacci(2)
res2: Option[Int] = Some(1)


另一个观察结果是,如果我使用if / else,则代码似乎可以正常工作而无需返回。但是我不明白为什么我不得不写return或if / else

if (nth<=0) None
  else if (nth == 1) Some(0)
  else if (nth == 2)  Some(1)
  else go(1,(0+1),2,nth)

nthFibonacci (0) //None
nthFibonacci(1) //Some(0)
nthFibonacci(2) //Some(1)

最佳答案

因为这就是控制流在Scala中的工作方式。由于go是最后一个表达式,因此if-else表达式只返回一个被忽略的值。

模式匹配可以在这里提供帮助:

nth match {
  case 0 => None
  case 1 => Some(0)
  case 2 => Some(1)
  case _ => go(1, (0 + 1), 2, nth)
}


这是if-else表达式的替代方法。如果仍然想使用if-else,请确保在最后一个分支中包含else

关于scala - 没有返回语句的“部分/无”中的垃圾值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41237155/

10-13 08:19