2017-03-22 5 views
-1

나는 writte에게 혀짤배기의 목록 역 기능을 가지고 있고 나는 그것을 테스트하고 싶어하지만 오류를했고 나는 그것을 기능을 해결할 수 있고, 전화는 다음과 같습니다 :혀짤배기 자체 개발 한 재귀 역 기능

(defun myreverse (list) 
    (cond((null list) nil)) 
    (cons (myreverse(cdr list) (car list)))) 


    (myreverse '(1 2 3)) 

어떤 도움이 이해할 수있을 것이다 ...

+1

무엇이 오류입니까? 또한 코드를보다 쉽게 ​​읽을 수 있도록 포맷 할 수 있습니다. 아니요, 첫 번째 열의 모든 표현식을 읽을 수는 없습니다. –

+0

"MYREVERSE에 인수가 너무 많습니다"라는 오류가 있습니다. 내 질문에 오류를 추가하는 것을 잊어 버려서 죄송합니다. –

+0

글쎄, 코드에 'myreverse'함수에 인수가 너무 많습니다. 오류 메시지는 매우 명확합니다. 그냥 고쳐 주면 어떨까요? –

답변

0

인수는 defunmyreverse 따라서 당신이 그것을 호출 할 때 (myreverse '(1 2 3))list(1 2 3)에 바인딩됩니다, (list) 때. 목록 이후

은 갑자기 (myreverse '(2 3) 1)list(2 3)에 바인딩됩니다 수행하지만 1이 바인딩합니까 null가 아닌? 하나 이상의 인수가 없으므로 호출이 유효하지 않으며 오류가 발생합니다.

Hint1는 :

(defun test (a &optional (b 0) (c 0)) 
    (+ a b c)) 

(test 10)  ; ==> 10 
(test 10 1 2) ; ==> 13 

Hint2 : 선택적 인수를 만들 수있는 방법이 넌 그냥 베어 요소를 통과하지 목록을 작성해야합니다. 전달 된 목록은 모든 요소가 추가 될 때까지 다음 라운드의 꼬리가됩니다.

0

나쁜 대답 (또는 하나의 나쁜 답) :

(defun reverse (list) 
    (cond ((null list) list) 
      (t (append (reverse (cdr list)) (cons (car list) nil))))) 

더 나은 답 :

(defun reverse (list) 
    (reverse-aux list nil)) 
(defun reverse-aux (list result) 
    (cond ((null list) result) 
      (t (reverse-aux (cdr list) (cons (car list) result))))) 

그것은 우리가 'APPEND'의 정의에 비교하여 기본적인 예를 사용하는 것 꼬리 재귀를 구별하는 교훈.