2017-01-02 93 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謝謝!我不知道,但這是件好事。 –