2015-05-19 11 views
0

После изучения большей части The Little Schemer, я пытался использовать некоторые рекурсивные решения для задач Coderbyte.«Сопоставление» маленького алгоритма с вызовом coderbyte: заглавная

После некоторого ворча я бросил минусы и подумал, что мой upperConsIt будет работать, чтобы просмотреть массив, найти все экземпляры конкретной буквы и загладить каждый из них. В конечном счете, у меня будет массив, который я могу преобразовать в строку с той буквой, которая теперь заглавная.

Thee ERROR появляется, когда я пытаюсь использовать 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

Я вижу. Итак, действительно нет эквивалента для cdr в только что встроенном JavaScript. –

+0

@GabrielKunkel Вы имеете в виду встроенный 'cdr', который соответствует вашей выбранной реализации' cons'? Вы могли бы легко реализовать пары с объектами и 'car',' cdr' как методы. (Я бы предпочел это) BTW. JavaScript имеет 'map' как метод для массивов, но он не использует пары. – Sylwester

+0

Я понимаю. Маленький Schemer помог мне полностью понять рекурсию, но он не переводится на JavaScript без создания библиотеки эквивалентов. В принципе, вы не можете смешивать функции Little Schemer и встроенные методы JavaScript. Я думал, что метод 'map' был только с underscore.js, но теперь некоторые из них являются частью ECMA. Благодарю. –