2013-06-26 2 views
3

Что я хотел бы сделать, это создать функцию, которая принимает список значений и список символов и объединяет соответствующие символы («атомы», я думаю, они технически быть вызванными) в новый список.Использование схемы/racket для возврата определенных элементов из списка

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

#lang racket 
(define (find num char) 
    (if (= num 1) 
    (car char)         ;Problem here perhaps? 
    (find (- num 1) (cdr char)))) 


(define (test num char) 
    (if (null? num) 
    '("Done") 
    (list (find (car num) (test (cdr num) char))))) 

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

> (test '(2 1) '(a b c)) 

car: contract violation 
expected: pair? 
given: '() 

По существу, на выходе должен быть '(b a) вместо ошибки очевидно.

Небольшая помощь и руководство для пользователя новой схемы оценили бы!

EDIT:

Вот код, который я смог бежать.

#lang racket 

(define (find num char) 
    (cond ((empty? char) #f) 
    ((= num 1) (car char)) 
    (else (find (- num 1) (cdr char))))) 


(define (project num char) 
    (if (empty? num) 
    '() 
    (cons (find (car num) char) (project (cdr num) char)))) 
+0

После редактирования «проект» он почти прав! просто базовый случай ошибочен: правильное значение для возврата - ''() ', а не' (list '()) ' –

+0

да, простите, я понял, что сделал это, вероятно, за несколько секунд до того, как вы прокомментировали. Это изменилось. –

ответ

4

Процедура find в основном верно (хотя это в основном изобретать велосипед и делать то же самое, что list-ref делает, но хорошо ...) просто быть осторожным, и не забудьте рассмотреть случай, когда список пусто:

(define (find num char) 
    (cond ((empty? char) #f) 
     ((= num 1) (car char)) 
     (else (find (- num 1) (cdr char))))) 

project процедура, с другой стороны, это не совсем верно. Вы должны знать, как написать рецепт для итерации по списку и создания нового списка в качестве ответа. Я дам вам несколько советов, заполнить пробелы:

(define (project num char) 
    (if <???>     ; if num is empty 
     <???>     ; then we're done, return the empty list 
     (cons     ; otherwise cons 
     <???>     ; the desired value, hint: use find 
     (project <???> char)))) ; and advance the recursion 

Это должно сделать трюк:

(test '(2 1) '(a b c)) 
=> '(b a) 
+0

отличное спасибо! Я добавил свой код выше. У меня есть, надеюсь, еще один быстрый вопрос. Если бы я должен был предоставить список, содержащий списки, т. Е. ''(2 1' (3 3 5))' есть ли простой способ справиться с этим дополнительным уровнем? (возможно, возможно, я туман по терминологии) –

+0

Если вам не нужно перебирать внутренние списки, то тот же код будет работать. Но если вам нужно идти «внутрь» и искать во внутренних списках, рецепт для итерации изменений. Моя рекомендация: либо программа «Маленькая схема», либо «Как разработать программы» помогут вам понять, как проблемы решаются на схеме –

+0

Спасибо, я посмотрю! –

0

Лучше поздно, чем никогда:

(define (coalesce nums chars) 
    (map (lambda (num) (list-ref chars (- num 1))) nums)) 
+0

избили меня :( – WorBlux

+0

Оскар уже получил это, и в этот момент мы играем для чистого удовольствия ... – GoZoner

0

С функций высшего порядка

#lang racket 

(define (find num chars) 
    (cond ((empty? chars) #f) 
    ((= num 1) (car chars)) 
    (else (find (- num 1) (cdr chars))))) 

(define (project nums chars) 
(let ((do-it (lambda (num) (find num chars)))) 
    (map do-it nums))) 
Смежные вопросы