2014-10-18 5 views
0

У меня небольшая проблема с DrRacket. Я запрограммировал довольно широко в C, C++, Java, Python и т. Д., Но никогда не работал с языком функционального программирования, поэтому я сработал.Список атрибутов из узлов в дереве

У меня есть узел, и мне нужно вернуть список функции «глазного цвета» этого узла и всех его родительских элементов (родителей родителей и т. Д.). Вот что у меня есть, и я не могу понять, где я ошибаюсь. Я подозреваю, что это связано со всеми «пустыми», которые мне нужно добавить, потому что я их не получаю. Так много чертовых скобок тоже, ха-ха. Все становится правильно, но вместо одного списка есть куча другого пространства или чего-то другого.

(define (eye-colors f) 
    (cond [(empty? f) empty] 
     [ else (cons (cons (child-eyes f) (eye-colors (child-mom f))) (eye-colors (child-mom f)))])) 

Мой выход для одного конкретного узла заключается в следующем:

(list 
(list 
    'blue 
    (list 'green (list 'brown)) 
    (list 'blue)) 
(list 'orange)) 

, когда оно должно быть таким:

(list 'blue 'green 'brown 'blue 'orange) 

Любая помощь, которую вы можете предложить очень ценится !!

+0

Это просто частный случай функции спреда списка (хотя использование структуры вместо conses в качестве входных данных). Существует несколько способов написания функции сглаживания, в том числе http://stackoverflow.com/a/7324493/13 и http://stackoverflow.com/a/13548087/13. –

ответ

0

Получил это! Проблема была вложенными списками из-за минусов. Решил проблему, переключив первые минусы на добавление, и теперь все отлично работает. Рабочий код приведен ниже.

(define (eye-colors f) 
    (cond [(empty? f) empty] 
     [ else (append (cons (child-eyes f) (eye-colors (child-mom f))) (eye-colors (child-dad f)))])) 
Смежные вопросы