這里的helper功能:
def zipWith[B]: (MyList[B], (A, B) => B) => MyList[B] = {
(list, function) => {
def helper: (MyList[B], MyList[A], MyList[B]) => MyList[B] = {
(consList, originalList, modList) =>
val wrapList = if (modList.isEmpty) list else modList
if (originalList.tail.isEmpty) consList NewList(function(originalList.head, wrapList.head), EmptyList)
else helper(consList NewList(function(originalList.head, wrapList.head), EmptyList),
originalList.tail,
modList.tail)
}
helper(EmptyList, this, list)
}
}
使用@tailrec注釋時無法識別。
這真的不是尾遞回嗎?它會導致堆疊溢位錯誤嗎?
或者這只是編譯器無法優化的尾遞回函式?為什么?
uj5u.com熱心網友回復:
helper不呼叫自己。它回傳一個最終呼叫的函式helper,但這不是一回事。
換句話說:helper不是尾遞回的,因為它甚至不是(直接)遞回的。
Scala 只能優化直接尾遞回。
uj5u.com熱心網友回復:
問題是遞回代碼是創建一個函式值然后呼叫它,而不是直接呼叫一個方法。
如果您更改為方法語法,它將是尾遞回的。
@annotation.tailrec
def helper(consList: MyList[B], originalList: MyList[A], modList: MyList[B]): myList[B] = {
val wrapList = if (modList.isEmpty) list else modList
if (originalList.tail.isEmpty) consList NewList(function(originalList.head, wrapList.head), EmptyList)
else helper(consList NewList(function(originalList.head, wrapList.head), EmptyList),
originalList.tail,
modList.tail)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/448951.html
上一篇:C:列印反向鏈表
