Схема домашнего задания, нужна помощь - PullRequest
3 голосов
/ 30 марта 2010

Хорошо, одна из моих домашних задач - взять список списков и вернуть автомобиль каждого подсписка в виде списка. У меня есть это, где я могу распечатать значения, но это не список. Если честно, я понятия не имею, как выводить списки. Вот что я получил:

(define (car-print alist)
  (if (null? alist)
      (newline)
      (begin
         (write (car (car alist))) (display " ")
  (car-print(cdr alist)))))

Это дешевый способ сделать это, возможно, будет полезна некоторая помощь в решении этой проблемы. Не обязательно полный ответ, но шаги, чтобы добраться туда. Спасибо.

Ответы [ 3 ]

1 голос
/ 30 марта 2010

Вы должны использовать map функцию:

> (define lst '((1 2 3) (4 5 6) (7 8 9)))
;Value: lst
> (map car lst)
;Value: (1 4 7)
1 голос
/ 30 марта 2010

Моя схема немного ржавая. И у меня под рукой только д-р-интерпретатор ...

Вам нужно использовать свой список и возвращать только первый элемент каждого подсписка.

Чтобы создать список, вы должны использовать директиву cons , и вам не нужно выводить ее, вам нужно вернуть ее как результат функции (но вы уже должны это знать).

Если вам нужно распечатать результат, вы должны отделить вычисление от вывода и решить проблемы печати на втором шаге.

Для построения списка у вас есть несколько конструкций, наиболее базовыми из которых являются минусы, он берет общий элемент (также список) и добавляет его к списку (также нулевому)

(cons 1) => error: cons need two parameters
(cons 1 null) => (list 1)
(cons 1 2) => error: need a value (first parameter) and a list (the second one)
(cons 1 (cons 2 null) => (list 1 2)

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

(define (car-list alist)
  (cond
    ((null? alist) null)
    (else (cons (car(car alist)) (car-list (cdr alist))))
  )
)
; tail recursion version usage: (car-acc-list alist null)
(define (car-acc-list alist acc)
  (cond
    ((null? alist) acc)
    (else (car-acc-list (cdr alist) (cons (car(car alist)) acc)))
  )
)

Я использовал cond вместо , если , потому что я думаю, что это позволяет лучше форматировать ваш код. Его структура проста: список предложений, с условием испытания (или другим) в качестве машины и действием, которое необходимо выполнить, если условие удовлетворяется как cdr. Если действие разрешается в значение ((null? Alist) null ), функция возвращается с этим значением в качестве возвращаемого значения. Если запускается рекурсия, то функция возвращается после завершения рекурсии.

Существует две версии решения, вы должны использовать степпер / отладчик, чтобы исследовать их различия.

Кстати, я использовал drscheme для проверки кода, это замечательный кусок бесплатного (lgpl) программного обеспечения. Незначительные отличия от других схемных сред, но код должен быть очень простым, и поэтому он должен работать везде без проблем.

0 голосов
/ 30 марта 2010

Чтобы разработать функцию, вам нужно знать, каковы ваши инструменты. Для списков у вас есть:

cons : n l -> (n l)
Construct a list out of an element and a list, placing the element n
at the head of the list

car : l -> n
Return the head of the list

cdr : l -> l
Return the tail of the list

Вы хотите написать функцию firstl , которая использует список списков и возвращает список. Вот некоторые примеры:

(firstl (list (list 1 2 3) (list 9 2 3) (list 4 7 3))) -> (1 9 4)
(firstl (list (list 1 2 3))) -> (1)
(firstl '()) -> ()

Последний пример должен дать вам первую подсказку: если аргумент - пустой список, вернуть пустой список.

(define (firstl lol)     ; list-of-lists (no laughing!)
  (if (null? lol)
    '()
    ....    ; more stuff goes here for the recursive "else" clause. Hint: use cons
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...