Как вручную сгладить список в 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))))
Другие вопросы по тегам