2014-04-01 2 views
0

목록을 가져 오는 간단한 재귀 함수를 만들고 목록의 요소를 기반으로 적절한 함수를 적용하려고합니다. 입력시 :목록을 구문 분석하여 요소 유형 결정

Input: (myfunct '(plus (minus(5 4) 3)) 
Output: 4 
그래서 문자열이 무엇인지 확인한 다음 그에 따라 표현식을 재귀 적으로 해결합니다. "플러스 4 5)) ('(myfunct을"이 입력에 (오류를 생성

(define (myfunct lis) 
    ((integer? (car lis)) (car lis)) 
    ((equal? 'plus (car lis)) (+ myfunct(car (cdr(lis)) myfunct(cdr(cdr lis)))))            
) 
//if its an integer, return it 
//if its plus, call myfunct with the 2 next heads of the list 

:

내가 (단지 플러스) 지금 무엇을 가지고

application: not a procedure; 
expected a procedure that can be applied to arguments 
    given: #f 
    arguments...: 
    plus 

나는 수정/내가 설명을하시기 바랍니다 수있는 오류에 대한 이유를 정확히 파악할 수없는

편집 :?

(define (myfunct lis) 
    (cond ((integer? lis) lis) 
     ((integer? (car lis)) (car lis)) 
     ((equal? 'plus (car lis)) 
      (+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis))))))) 

작동 대상 : (myfunct '(plus (plus 4 5) 6) 그러나 여전히 ... (myfunct '(plus (plus 4 5) (plus 2 3)))과 호환되지 않습니다. 두 번째 인수는 void "()"로 다시 돌아옵니다. 재귀 트리를 그렸고 그 오류에 대한 이유를 볼 수 없습니다. 어떤 아이디어?

EDIT 2 : 최종 작동 대답, 100 % 확신 할 수없는 이유는 다른 이유가 아닌 것입니다. 제 2 인수는 (어느 점에서) (플러스 1 1) 대신 (플러스 1 1), 그 차는 잘못된 값을 반환합니다.

(define (myfunct lis) 
    (cond ((integer? lis) lis) 
      ;;((integer? (car lis)) (car lis)) 
     ((equal? 'plus (car lis)) 
      (+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis))))) 
     (else (myfunct (car lis))))) 
+0

'(CDR을 (cdr lis))'는 표현식이 모두 적절한 목록 인 경우 목록이됩니다. 아마도'(caddr lst)'가 더 적합 할 것이고'(car x)'가 더 이상 정수가 아닌지를 확인할 필요가 없을 것입니다. – Sylwester

답변

2

괄호에 몇 가지 문제가 있습니다 (일부는 누락되거나 일부 잘못 배치 됨). 이와 같은 오류를 잡기 위해 IDE의 도구를 사용하십시오. 게다가

((integer? (car lis)) (car lis)) 
^       ^
wrong       wrong 

당신은 : - 라켓 당신이 절차를 적용하려는 것으로 생각하기 때문에 특히, 몸에 두 줄을 둘러싼 괄호가 잘못 당신이 application: not a procedure 오류가 발생하는 이유입니다conditionals (if, cond 등)을 사용해야합니다. 그리고 각 표현식의 일부를 올바르게 처리하지 않고 목록의 첫 번째, 두 번째 및 세 번째 요소에 액세스하는 방법을 파악합니다.

이 연습 문제를 해결하기 전에 구문에 익숙해지고 더 짧고 간단한 절차를 작성하는 것이 좋습니다. 내가 채우기에 공백, 당신이 시작하는 데 몇 가지 힌트를 줄 것이다 :

(define (myfunct lis) 
    (cond ((integer? lis) 
     lis) 
     ((equal? 'plus <first element>) 
     (+ (myfunct <second element>) (myfunct <third element>))) 
     (<similarly for the 'minus case>) 

을 모두가 올바른 경우, 사용자가 제공 한 샘플 입력은 예상대로 작동합니다 :

(myfunct '(plus 4 5)) 
=> 9 
(myfunct '(plus (minus 5 4) 3)) 
=> 4 
+0

코드를 작업하면서 잠시 후에 업데이트하겠습니다. 중첩 된 플러스 작업을 시도하고 있습니다 (단수 플러스가 작동 중입니다). – Colton

관련 문제