2017-10-06 135 views
0

這可能是一個奇怪的問題,但...斯卡拉尾遞歸爲未尾遞歸

問: 如何打開一個尾遞歸功能斯卡拉成非尾遞歸解決方案?

注意:我知道尾部遞歸解決方案在Scala中非常棒,但我被要求將其更改爲非尾部遞歸解決方案。我不知道該怎麼做

我有我在這裏一尾遞歸解決方案代碼(至少我希望它是尾遞歸笑)

def cubesTailRecur(a: List[Int], acc: List[Int] = List.empty): List[Int] = { 
     a match { 
     case Nil => acc 
     case h :: t if (h%2 == 0) => cubesTailRecur(t, acc) 
     case h :: t => cubesTailRecur(t, acc :+ Math.pow(h, 3).toInt) 
     } 
    } 

什麼我的功能確實是通過給定的列表迭代的整數並返回一個新數組,其中包含所有奇數的立方體。

實施例:

println(cubesTailRecur(List(1, 2, 3, 4, 5, 6, 7))) 

    // OUTPUT 
    // List(1, 27, 125, 343) 

回答

4

尾遞歸是遞歸的一種形式,其中遞歸調用是最後的指令。爲了不讓尾部遞歸,意味着你需要用遞歸調用的結果做一些其他的計算。

對於您的情況,您可以刪除acc/accumulator參數並通過遞歸堆棧執行累加。沿着以下幾行,

def cubesRec(a: List[Int]): List[Int] = a match { 
    case Nil => List[Int]() 
    case h::t if (h%2 == 0) => cubesRec(t) 
    case h::t => Math.pow(h,3).toInt :: cubesRec(t) 
} 
+0

這有效,但有一個問題。它以相反的順序打印列表。例如:列表(1,27,125,343)與列表(343,125,27,1) – Phillip

+0

如何反轉?編輯:如何在功能中將其反轉。我知道如何在印刷時反轉 – Phillip

+0

你可以使用'Math.pow(h,3).toInt :: cubesRec(t)' – lztachyon