2015-04-04 2 views
0

Я новичок в схеме, поэтому заранее прошу прощения за элементарный вопрос. Я пытаюсь создать рекурсивный нисходящий список. В настоящее время он возвращает (1 2 3) вместо (3 2 1)Схема по убыванию

Я думаю, проблема в том, что я помещаю свой новый элемент спереди, а не в конец списка. Тем не менее, я не совсем уверен, как это получить, поскольку я продолжаю получать ошибки, когда пытаюсь.

Вот что я до сих пор:

(define (descend N mylist) 
    (if (= N 0) mylist 
     (descend (- N 1) (cons N mylist)))) 

(descend 3 '()) 

ответ

0

Прежде всего, mylist аргумент совершенно ненужным. Это не что иное, как пустой список, поэтому его можно просто исключить.

Прежде всего, если вам не нужна ваша функция, чтобы быть рекурсивной, то просто измените порядок своих вызовов на cons и descend, чтобы список был построен в противоположном направлении.

(define (descend N) 
    (if (= N 0) '() 
     (cons N (descend (- N 1))))) 

Если вам нужна хвостовая рекурсией версия, то это, вероятно, больше смысла, чтобы создать аккумулятор с хелперами циклом и просто перебирать в обратном направлении.

(define (descend N) 
    (let loop ((x 1) 
      (acc '())) 
    (if (= x N) (cons x acc) 
     (loop (+ x 1) (cons x acc))))) 
+0

Спасибо Алексис за вашу помощь. Согласен. Мне нравится ваше первое решение. Это чисто и просто. Тем не менее, у меня есть требование, чтобы моя функция была - «элемент, список» и иметь ее хвостовую рекурсию. Вот почему у меня был «mylist». Есть ли у вас какие-либо предложения по удовлетворению этого требования? – user3281388

+0

@ user3281388 Можете ли вы уточнить, что должен делать второй параметр? Всегда ли это просто хвост сгенерированного списка? –

+0

Я понимаю, что список будет тем, что, наконец, вернется. Я передаю int, затем он возвращает нисходящий список. – user3281388

Смежные вопросы