1
(defun help(a x)
  (if (null x) nil
    (cons (cons a (car x)) (help a (cdr x)))))

(defun partition(x)
    (if (null x) '(nil)
    (append (help (car x) (partition(cdr x))) (partition(cdr x)))))

これは次のよう(partition '(a b)) -> ((A B) (A) (B) NIL) に機能します。どのように機能するかを理解しようとしています。誰かが結果を得るために何が起こっているかを説明できますか? コードをたどって紙に書き留めようとしましたが、失敗しました。

4

1 に答える 1

6

このtrace関数を使用すると、LISP REPL で関数呼び出しを視覚化できます。

からの出力例sbcl

* (defun help(a x)
  (if (null x) nil
    (cons (cons a (car x)) (help a (cdr x)))))

HELP
* (defun partition(x)
  (if (null x) '(nil)
    (append (help (car x) (partition(cdr x))) (partition(cdr x)))))

PARTITION
* (trace help)

(HELP)
* (trace partition)

(PARTITION)
* (partition '(a b))
  0: (PARTITION (A B))
    1: (PARTITION (B))
      2: (PARTITION NIL)
      2: PARTITION returned (NIL)
      2: (HELP B (NIL))
        3: (HELP B NIL)
        3: HELP returned NIL
      2: HELP returned ((B))
      2: (PARTITION NIL)
      2: PARTITION returned (NIL)
    1: PARTITION returned ((B) NIL)
    1: (HELP A ((B) NIL))
      2: (HELP A (NIL))
        3: (HELP A NIL)
        3: HELP returned NIL
      2: HELP returned ((A))
    1: HELP returned ((A B) (A))
    1: (PARTITION (B))
      2: (PARTITION NIL)
      2: PARTITION returned (NIL)
      2: (HELP B (NIL))
        3: (HELP B NIL)
        3: HELP returned NIL
      2: HELP returned ((B))
      2: (PARTITION NIL)
      2: PARTITION returned (NIL)
    1: PARTITION returned ((B) NIL)
  0: PARTITION returned ((A B) (A) (B) NIL)
((A B) (A) (B) NIL)

それ以外では、どうすればもっと役立つのか完全にはわかりません。

于 2013-05-10T23:33:03.150 に答える