Может кто-нибудь объяснить следующий код Схемы? - PullRequest
3 голосов
/ 04 октября 2009

Я слушал серию лекций Стэнфорда по парадигме программирования , но меня смущает следующий код (из лекции 20). Кто-нибудь объяснит, строка за строкой, что это делает?

Спасибо.

(define (flatten sequence)
  (cond ((null? sequence) '())
        ((list? (car sequence)) (append (flatten (car sequence))
                                        (flatten (cdr sequence))))
        (else (cons (car sequence)
                    (flatten (cdr sequence))))))

Ответы [ 2 ]

7 голосов
/ 04 октября 2009
# define a procedure 'flatten' that takes a list 'sequence'
(define (flatten sequence)
  # if the 'sequence' is empty, return an empty list
  (cond ((null? sequence) (list))
        # if the first element of 'sequence' is itself a list, return a new list
        # made by appending the flattened first element of 'sequence' with the
        # flattened rest of the 'sequence'
        ((list? (car sequence))
         (append (flatten (car sequence))
                 (flatten (cdr sequence))))
        # if the first element of 'sequence' is not a list, return a new list
        # made by cons-ing that element with the flattened rest of the 'sequence'
        (else
         (cons (car sequence)
               (flatten (cdr sequence))))))

Я красиво напечатал его (вставил несколько новых строк и отступ для кода, чтобы показать его структуру), а также заменил '() на (list) (который имеет то же значение), чтобы предотвратить неправильное выделение кода. *

+ 1 что есть? Буду признателен, если вы объясните и другие ключевые слова. спасибо

Когда я говорю «против», я просто имею в виду процедуру cons. Когда вы видите (cons <expression> <list>), где <expression> - любое выражение или значение Схемы, а <list> - любое выражение Схемы, которое вычисляется в виде списка, cons вернет <list> со значением <expression>, прикрепленным на передней панели. Например, (cons 1 (list 2 3 4)) возвращает список (list 1 2 3 4). На самом деле, (list 1 2 3 4) в Схеме - это всего лишь короткий способ написания (cons 1 (cons 2 (cons 3 (cons 4 '() )))).

Двумя другими словами, с которыми у вас могут возникнуть проблемы, являются car и cdr. Вы можете думать о (car <list>) как о значении первый элемент или голова из <list> и (cdr <list>) как о значении rest элементов или хвост из <list>. Например, (car (list 1 2 3 4)) возвращает значение 1, а (cdr (list 1 2 3 4)) возвращает список (list 2 3 4).

Если вам нужна помощь с другими ключевыми словами, сообщите мне.

1 голос
/ 04 октября 2009
  1. определить функцию для выравнивания последовательность

  2. Для пустой последовательности верните пустую

  3. если глава (автомобиль) списка последовательность возвращает результат сглаживая его прилагается к уплощение хвоста (cdr)

  4. еще добавь голову к плющу хвоста

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...