Как обеспечить функцию хвостовой рекурсивной? [Дубликат]

ваши ответы слишком сложны

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
9
задан Eogcloud 2 December 2012 в 01:01
поделиться

1 ответ

Чтобы функция была рекурсивной с хвостом, после возвращения функции не должно быть ничего общего, кроме как вернуть ее значение. То есть последнее, что происходит на рекурсивном шаге, - это вызов самой функции. Это обычно достигается с помощью параметра аккумулятора для отслеживания ответа:

(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)))))
22
ответ дан Óscar López 1 September 2018 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: