Идея состоит в том, что вам нужна рекурсивная функция, которая:
- Проверяет, является ли список пустым
- Проверяет, является ли первый элемент списком, если не
cons
к функции, примененной к cdr
списка - В противном случае функция применяется как к
car
, так и к cdr
и cons
для получения результатов.
Вотнепроверенная попытка:
(define flatten
(lambda lst
(cond
((null? lst) lst)
((atom? (car lst)) (cons (car lst) (flatten (cdr lst))))
(else (cons (flatten (cons (car (car lst) (cdr (car ls)))
(flatten (cdr lst)))))))
Где atom?
- это функция, которая проверяет, является ли элемент в списке не списком.Вот как atom?
определяется в Little Schemer :
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
Я настоятельно рекомендую The Little Schemer, если у вас возникают проблемы с организацией логики рекурсивных функций.