2017-01-02 5 views
-2
私はARD(X)を割り当てるしようとすると、私はエラーのミスマッチを取得取得しています
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) 

がFIBIを=(X-1)+ FIBI(X-2)FIBIが戻っているので、 INTなぜ型エラーが発生するのですか?再帰関数はScalaで代わりにINTの単位を返し

答えて

1

代入は、cで指定された値と型ではなく、Scalaで単位を返します。 (例: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.あなたのコードをインデントし、明示的なリターンの不要な使用を省略し、@tailrec注釈でスタックの成長を防ぐことを検討してください。

+1

"@tailrecアノテーションでスタックが成長するのを防ぐ"コンパイラは、この注釈を持っているかどうかにかかわらず、末尾再帰としてコンパイルします。注釈は、関数が非末尾再帰であることが判明したときにエラーを引き起こすことです。 –

+0

@TheArchetypalPaulありがとう!私はそれを知らなかったが、それは良いことだ。 –

関連する問題