Схема минусов проблемы создания правильного списка - PullRequest
0 голосов
/ 03 ноября 2010

У меня проблемы с добавлением списка в этой функции схемы.

Функция должна принимать 2 аргумента и возвращать список, состоящий из 2-х элементов, количество раз указанное в 1-м элементе. Например, если вы звоните (make-list? 5 4), ваш вывод должен быть (4 4 4 4 4).

Проблема в том, что когда я использую cons, я получаю ((((4 . 4) . 4) . 4) . 4). Насколько я понимаю, я добавляю в конец всего списка как объект каждый раз, не последний элемент этого, как я хочу . Я не уверен, как это исправить.

Вот моя функция, предложения о том, как использовать последний элемент вместо списка в качестве объекта, было бы здорово. (или другие предложения, если это не единственная / реальная проблема.)

;make-list
(define make-list?
  (lambda (N A)
    (if (= N 1)
       A
       (cons (make-list?(- N 1) A ) A)
    )
  )
)

Ответы [ 2 ]

2 голосов
/ 03 ноября 2010

Хорошее практическое правило заключается в том, что каждый список заканчивается на '(). В этом случае может быть более наглядным сделать базовый вариант 0 и вернуть пустой список:

(define make-list?
  (lambda (n a)
    (if (zero? n)
        '()
        (cons a (make-list (sub1 n) a)))))

Так что в этом примере, если мы нажмем 0, то мы возвращаем пустой список, чтобы «закрыть» список, который мы строим.

1 голос
/ 03 ноября 2010

Ваша проблема раздражает и вызвана тем, как работают cons-ячейки.(cons ab) создает cons-ячейку, если b не является списком.Переупорядочив таким образом, вы добавляете атом в список, а не наоборот, и делаете его таким, чтобы самым внутренним элементом был список (кстати, вы можете использовать (cons A '()) вместо (list A)в следующем определении) вы обойдете это.

(define make-list?
  (lambda (N A)
    (if (= N 1)
       (list A)
       (cons A (make-list?(- N 1) A ))
    )
  )
)
...