2015-05-19 54 views
0

在學習了大部分The Little Schemer之後,我一直在努力研究Coderbyte挑戰的一些遞歸解決方案。「映射」Little Schemer到coderbyte挑戰:資本化

經過一番搗鼓之後,我投入了一番思緒,並認爲我的upperConsIt會查看數組,查找某個特定字母的所有實例,並將每個字母大寫。最終,我將有一個數組,我可以將其轉換爲一個字母,並且該字母現在大寫。

當我嘗試使用shift()像cdr時,會彈出錯誤。爲什麼是這樣?在這種情況下,我需要做些什麼來遞歸處理JavaScript?

'use strict'; 
 
var newArray = []; 
 
var originalText = 'i will eat my sausage if i can'; 
 
var arrayToProcess = textIntoArray(originalText); 
 

 
function cons(a, d) { 
 
    return [a, d]; 
 
} 
 

 
function textIntoArray(string) { 
 
    return string.split(''); 
 
} 
 

 
function upperConsIt(array, letter) { 
 
    return array[0] === null ? null : 
 
    array[0] === letter ? cons(array[0].toUpperCase(), upperConsIt(array.shift(), letter)) : 
 
    cons(array[0], upperConsIt(array.shift(), letter)); 
 
} 
 

 

 
upperConsIt(arrayToProcess, 'i'); 
 

 
console.log(arrayToProcess); 
 

 
phantom.exit();

以下是錯誤輸出:

TypeError: undefined is not a constructor (evaluating 'array.shift()')

我只是不明白這是怎麼一個類型的錯誤。數組應該是一個數組,對嗎?

回答

0

一個列表是2個元素的嵌套數組['t',['e',['s',['t',null]]]]

斯普利特製造['t', 'e', 's', 't']

array.shift()變異。你真的應該用這樣的東西,而不是:

function car(cons) { 
    return cons[0]; 
} 

function cdr(cons) { 
    return cons[1]; 
} 
+0

我明白了。因此,在剛剛構建的JavaScript中確實沒有與cdr等效的內容。 –

+0

@GabrielKunkel您的意思是內置的cdr'恰好匹配您選擇的'cons'實現?你可以很容易地將對象與'car','cdr'實現爲方法。 (我會更喜歡)順便說一句。 JavaScript有'map'作爲數組的方法,但它不使用pair。 – Sylwester

+0

我明白了。 Little Schemer確實幫助我完全理解遞歸,但是如果不先構建等價類庫,它不會轉化爲JavaScript。基本上,你不能真正混合Little Schemer函數和JavaScript內置方法。我以爲'map'方法只是使用underscore.js,但現在其中一些是ECMA的一部分。謝謝。 –