재귀

2013-05-10 2 views
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))))) 

와 LISP 프로그램을 이해하는 것이 필요 : (partition '(a b)) -> ((A B) (A) (B) NIL) 나는 그것이 어떻게 작동하는지 이해하기 위해 노력하고있어. 누군가 결과를 얻으려는 것을 설명 할 수 있습니까? 나는 코드를 따르고 종이에 글쓰기를 시도했지만 실패했다.재귀

+0

무엇을하려하십니까? – zellio

+0

프로그램은 목록으로 주어진 세트의 파티션을 찾습니다. 나는 그것이 어떻게되는지 알아 내려고하고있다. – 10001a

+0

예'(partition (ab)) => ((AB) (A) (B) NIL)'는 파티션보다 파워 세트와 비슷해 보입니다. "파티션"이 무엇인지 생각하지 않습니다. 여기에 의미합니다. –

답변

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) 

에서

예 출력은 좀 더 도움이 될하는 방법을 전혀 모르겠어요.

+0

대단하군요! 나는 추적에 대해 잘 몰랐다. – 10001a

+0

SBCL에만 국한되지는 않지만 표준에 있습니다. 출력 형식은 구현에 따라 다릅니다. – Svante

+0

@Svante -이 사실을 반영하여 멋진 질문입니다. – zellio