2016-02-16 2 views
0

Учитывая список определение:Синтаксические по списку рэкета

(define list 
'((a1 20 (1 a2) (3 a3)) 
    (a2 10 (2 a4)) 
    (a3 10 (1 a5) (2 a6) (3 a7)) 
    (a4 21) 
    (a5 12) 
    (a6 6 (1 a4) (2 a5)) 

)) 

Как вы пишете функцию (суб «a1) будет возвращать список (а2 а3). я могу найти список ((1 a2) (3 a3)) со следующим кодом:

(define (sub val) 
(cdr(cdr(cond ((assq val list)) 
     (else 0))))) 

Но что мне делать после этого, чтобы получить только те элементы, которые я хочу? Я пробовал сделать рекурсию, но это просто по кругу. Любой совет будет принят во внимание.

Второй вопрос: функция для получения списка только «а» с числовым значением, меньшим или равным указанному входу, т.е. (тест 10) вернется (a2 a3 a6) Я могу проверить один список, но я Я застрял в том, как пройти через весь список списка и добавить значения.

ответ

0

Все, что вам нужно, это функция map. Таким образом, либо использовать свой собственный sub функцию, как это:

(map cadr (sub 'a1)) 

Или изменить функцию, чтобы включать map:

(define (sub val) 
    (map cadr (cdr(cdr(cond ((assq val list)) 
     (else 0)))))) 

(cadr lst) это просто ярлык для (car (cdr lst)). Мои навыки Racket немного ржавые, поэтому я не буду говорить, что ваша функция sub полностью верна или имеет какие-либо сбои.

+0

спасибо. Другой вопрос, если вы можете помочь. Функция, чтобы получить список только «a» с числовым значением, меньшим или равным заданному входу, т.е. (тест 10), вернется (a2 a3 a6), я могу проверять один список за раз, но я застрял в том, как перейдите ко всему списку списка и добавьте значения. – codegirl

+0

Я не совсем понимаю ваш вопрос. Почему «a6» или «a3» подходят там, но «a7» нет? – fanton

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