2015-05-12 4 views
1

Я хочу, чтобы написать функцию, которая для n аргументов будет создавать n списки и каждый из которых содержит п-й элемент для каждого аргумента, например:Создание списков из списков

(aux '(1 2) '(3 4)) = `((1 3) (2 4)) 

Я написал такую ​​функцию:

(define (aux . args) 
    (if (null? args) 
     '() 
     (cons (map car args) 
      (aux (map cdr args))))) 

но когда я пытаюсь оценить (aux '(1 2) '(3 4)), REPL не показывает никакого выхода. Мой вопрос в том, что я должен изменить, потому что я не вижу никаких синтаксических ошибок.

+0

Хотя он не затрагивает проблемы в вашем коде, обратите внимание, что это обычно делается с помощью ** (списков списков карт) **. Например, ** (список карт '(1 2)' (3 4)) ** производит ** ((1 3) (2 4)) ** и ** (применять список карт '((1 2) (3 4))) ** производит то же самое. –

ответ

2

Крис прав. В случае, если вы хотите использовать аргументы отдыха, а затем использовать его в рекурсии, вы должны рассмотреть его обертывание по имени let или выполнить локальную процедуру помощника.

(define (zip . args) 
    (let aux ((args args)) 
    (if (ormap null? args) 
     '() 
     (cons (map car args) 
       (aux (map cdr args)))))) 

Я также делаю это, когда есть аргументы, которые не меняются. например. map реализация только один список не проходят процедуру на каждой итерации:

(define (map1 proc lst) 
    (let aux ((lst lst)) 
    (if (null? lst) 
     '() 
     (cons (proc (car lst)) 
       (aux (cdr lst)))))) 

Конечно, что на самом деле будет происходить до реализации, так что не думаю, что любой из них, как оптимизаций. Это в основном для ясности кода.

2

Вы забыли написать apply в своей функции. Не волнуйтесь, я все время делаю эту ошибку, поэтому я сразу заметил ее. ;-)

В принципе, вам необходимо использовать (apply aux (map cdr args)). В противном случае ваш aux рекурсируется только с одним аргументом.

О, и вам также необходимо использовать (ormap null? args), а не только (null? args), так как в базовом случае все ваши списки исчерпаны, а не то, что у вас нет никаких списков.

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