ваши ответы слишком сложны
var buildSet = function(array) {
var set = {};
for (var i in array) {
var item = array[i];
set[item] = item;
}
return set;
}
var myEnum = buildSet(['RED','GREEN','BLUE']);
// myEnum.RED == 'RED' ...etc
Чтобы функция была рекурсивной с хвостом, после возвращения функции не должно быть ничего общего, кроме как вернуть ее значение. То есть последнее, что происходит на рекурсивном шаге, - это вызов самой функции. Это обычно достигается с помощью параметра аккумулятора для отслеживания ответа:
(define (factorial x acc)
(if (zero? x)
acc
(factorial (sub1 x) (* x acc))))
Вышеупомянутая процедура будет изначально вызываться с помощью 1
в качестве аккумулятора, например:
(factorial 10 1)
=> 3628800
Обратите внимание, что накопленное значение возвращается, когда базовый случай достигнут, и что параметр acc
обновляется в каждой точке рекурсивного вызова. Мне пришлось добавить один дополнительный параметр в процедуру, но этого можно избежать, указав внутреннюю процедуру или имя let
, например:
(define (factorial x)
(let loop ((x x)
(acc 1))
(if (zero? x)
acc
(loop (sub1 x) (* x acc)))))