Как вручную сгладить список в Racket (Схема)
Как можно сгладить список без использования встроенной в ракетку функции сглаживания?
Я понимаю, что стандартная реализация flatten
(define (flatten lst)
(cond
((null? list)
empty)
((list? (car lst))
(append (flatten (car lst)) (flatten (cdr lst))))
(else
(cons (car lst) (flatten (cdr lst))))))
но я не совсем уверен, как не использовать функцию сглаживания, так как я не знаю, как она работает за кулисами. Я не мог найти хорошее объяснение этого, кроме реализации этого кода. Может кто-нибудь объяснить, пожалуйста
Это моя очень плохая попытка, и я почти ничего не знаю, потому что это даже не близко и не будет работать....
(define acc null)
(define (my-flatten lst)
(cond
[(null? lst) null]
[(list? (car lst)) (help-flatten (car lst)) (append (cdr lst) acc)]
[else (append (car lst) acc) (my-flatten (cdr lst))]))
(define (help-flatten subLst)
(if (null? subLst)
(set! acc null)
(append (car subLst) acc))
(help-flatten (cdr subLst)))
1 ответ
Решение
Первая показанная реализация является автономной, но неверной, и она не вызывает встроенную функцию Racket. flatten
- он просто называет себя рекурсивно, переименуйте его, чтобы понять, что я имею в виду. Вот исправленная версия:
(define (my-flatten lst)
(cond ((null? lst) empty) ; you wrote `list` instead of `lst`
((pair? (car lst)) ; it's more efficient if we use `pair?`
(append (my-flatten (car lst)) (my-flatten (cdr lst))))
(else (cons (car lst) (my-flatten (cdr lst))))))
Или немного проще:
(define (my-flatten lst)
(cond ((null? lst) '())
((pair? lst)
(append (my-flatten (car lst)) (my-flatten (cdr lst))))
(else (list lst))))