2017-01-02 95 views
-2
scala> var ard=new Array[Int](25) 
ard: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 

scala> ard(0)=0 

scala> ard(1)=1 

scala> def fibi(X:Int):Int = X match{ 
case 0 =>0 
case 1 =>1 
case _ => { 
if (ard(X)!=0) 
{ 
return ard(X) 
} 
else 
{ 
return ard(X)=fibi(X-1)+fibi(X-2) 
} 
} 
} 
<console>:19: error: type mismatch; 
found : Unit 
required: Int 
     return ard(X)=fibi(X-1)+fibi(X-2) 

我正在获取错误不匹配时,我尝试分配ARD(X)= FIBI(X-1)+ FIBI(X-2),因为FIBI返回一个INT为什么我会收到类型错误递归函数Scala中返回,而不是INT一个单位

回答

1

赋值返回Scala中的单位,而不是c中赋值的事物的值和类型。 (例如,请参阅What is the motivation for Scala assignment evaluating to Unit rather than the value assigned?

要修复类型错误,只需执行赋值并分别单独返回。

def fibi(X:Int):Int = X match{ 
    case 0 =>0 
    case 1 =>1 
    case _ => { 
    if (ard(X)!=0) 
    { 
     return ard(X) 
    } 
    else 
    { 
     ard(X)=fibi(X-1)+fibi(X-2) 
     return ard(X) 
    } 
    } 
} 

p.s.考虑缩进代码,省略显式返回的不必要的使用,并通过注释来防止堆栈增长。

+1

“使用@tailrec注释防止堆栈增长”。无论您是否有此注释,编译器都会将其编译为尾递归。当函数变为非尾递归时,注释会导致错误。 –

+0

@TheArchetypalPaul谢谢!我不知道,但这是件好事。 –