2015-02-26 2 views
2

Как можно сгладить список, не используя функцию сглаживания, встроенную в ракетку?Как вручную сгладить список в 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)))))) 

, но им не совсем уверен, как идти о не используя функцию Flatten как я не знаю, как он работает за кулисами. Я не мог найти хорошее объяснение этому, кроме реализаций этого кода. Может кто-то пожалуйста, объясните

Это моя самая плохая попытка и им в значительной степени невежественны, потому что это даже не близко и не будет работать ....

(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))) 
+0

Что вы имеете в виду? первая функция «сглаживания» не используется с помощью функции «сглаживания» Racket, она рекурсивно вызывает себя. Эта реализация в значительной степени самодостаточна, но неверна - см. Мой ответ. Кроме того, старайтесь избегать использования операций мутации ('set!'), Это не то, как мы пишем большинство функций в Схеме. –

ответ

5

Первая реализация показана самодостаточным, но неправильно , и он не вызывает встроенный 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)))) 
+0

Мне жаль, я, должно быть, неправильно истолковал код, который я читал. Я программировал в течение нескольких часов, иногда кое-что извращается через некоторое время. Я получаю цитату в своем выпуске, хотя, что это значит? > (мой-придавить '(1 2' (3 4) 5)) «(1 2 3 4 котировки 5) - Извините за мое плохое понимание Ракетки, я довольно новый для этого –

+0

@JamesCombs удалите самую внутреннюю цитату, которая вызывает проблему. –

+0

Я думаю, что 'list?' может быть O (1) в '#! racket', но использование' pair? 'также будет поддерживать точечные списки (по крайней мере, последнюю версию). – Sylwester