2016-10-24 6 views
0

Я только что начал изучать схему и обнаружил, что часть cons-cdr немного усложняется. Я делаю функцию, которая принимает список, а затем отображает все атомы в этом списке, в том числе в под списках, как если бы это был один большой список. Это будет выглядеть следующим образом: (придавить «(1 (2 3) 4 5 (6 7)))Scheme Program обрабатывает вспомогательные списки в один список

(1 2 3 4 5 6 7)

Вот мой код:

(define (flatten list1) 
    (if (not (empty? list1)) 
    (if (atom? (car list1)) 
    (cons (car list1)(flatten (cdr list1))) 
    (begin 
    (flatten (car list1)) 
    (flatten (cdr list1)))) 
    '())) 

Однако при этом он удаляет подсписные буквы. Таким образом (flatten '((1 2) 3 4) вместо (1 2 3 4) будет давать (3 4).

Любая помощь? Проблема, вероятно, в разделе «(начало», но я могу " т понять это ..

Благодаря

+0

Это домашнее задание, или вы просто пытаетесь понять сами по себе? Мой намек (если это домашняя работа) заключается в том, что весь список, который вы предоставили, обрабатывается, но вы никогда не комбинируете вывод двух функций в разделе 'begin'. Это означает, что только '(flatten (cdr list1))' фактически возвращается. –

+0

Кроме того, вам нужно иметь возможность идти вглубь в списки или быть достаточной глубиной 1? Под этим я подразумеваю: «((1 2) 3 ((4 5) 6))' process to '(1 2 3 (4 5) 6)' или '(1 2 3 4 5 6)'? –

ответ

0

попробовать что-то подобное в вашем ваших begin блоке

(append (flatten (car aList)) (flatten (cdr aList))) 

Также пост это почти тот же самый вопрос, если не то же самое: flatten list

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