2015-11-10 101 views
1

在雄辯的JavaScript書中,練習4.3是關於構建列表的。現在的問題是

「Write函數第n這需要一個列表和數量,並在列表中的指定位置返回元素,或者當沒有這樣的元素未定義的。返回列表中的第n個元素 - 雄辯javascript 4.3

如果您還沒有準備好,還寫一個遞歸版本的nth。「

因此,這裏是他們的解決方案

function arrayToList(array) { 
    var list = null; 
    for (var i = array.length - 1; i >= 0; i--) 
    list = {value: array[i], rest: list}; 
    return list; 
} 

function nth(list, n) { 
    if (!list) 
    return undefined; 
    else if (n == 0) 
    return list.value; 
    else 
    return nth(list.rest, n - 1); 
} 

console.log(nth(arrayToList([10, 20, 30]), 1)); 
// → 20 

我不明白是怎麼if (!list)被檢查,如果第n值是存在的。它看起來像是在檢查列表本身是否爲假。

關於我缺少的任何指針?

感謝

+0

您是右側的列表中。它不檢查是否存在第n個值。它正在檢查列表是否存在。 –

+0

@LeoFarmer它是遞歸的,如果list.rest返回列表的尾部,它將檢查下一次迭代。順便說一句,我想知道什麼是列表的結構? '{rest:{rest:rest,value:1},value:2}'?如果第n個值不存在,它將返回「未定義」,如任務中所示。 –

+0

如何定義空列表?你會期望'n(nil,0)'或'nn({value:...,rest:nil},1)'返回什麼? – Bergi

回答

2

if(!list) {...檢查在這是完全必要的,並檢查是否在列表中的數量。如果您看看函數return nth(list.rest, num -1);的遞歸部分,則list.rest部分將深入到子列表中,如果走得足夠遠,您將到達列表的末尾,rest屬性將引用null。因此,如果您輸入的號碼比列表中的項目長,您將遇到!list條件並返回未定義狀態。

我會告訴你,這是獲得最初傳入的挑戰,所以你可以看到那裏的rest:null

{ value: 10, rest: { value: 20, rest: { value: 30, rest: null } } }