2013-12-13 5 views
1

Scheme (LISP)에 간단한 재귀 적 정의를 쓰려고합니다.목록의 원자 요소를 계산하는 Scheme 함수

목표는 목록의 원자 요소 수를 계산하고 내부 목록 원자도 재귀 적으로 계산하는 것입니다. 예를 들어

:

(num_items '((a b) c d)) 

반환한다은 :

4 

"b", "c""d", "a" 때문에 목록/서브리스트에서 4 개 개의 원자 원소이다.

다음과 같이 내 코드는 지금까지 있습니다 :

(define (num_items X) 
(cond 
    ((null? X) 0) 
    (list? (car X) (+ (num_items(car X)) (num_items(cdr X)))) 
    (else (+ 1 (num_items(cdr X)))) 
)) 

(display(num_items '((a b) c d))) 

는 오류가 4 번째 줄에 발생합니다 : 지금까지 내가 말할 수있는

(list? (car X) (+ (num_items(car X)) (num_items(cdr X)))) 

, 추가의 (num_items(car X)) 재귀에 보인다 오류의 원인이 될 수 있습니다.

(list? (car X) (+ 1 (num_items(cdr X)))) 

그런 다음 코드를 컴파일하고 실행하지만, 그것은 문제가 해결되지 않은 : 나는 1과 라인의 일부를 교체하는 경우 예를 얻을합니다.

코드를 테스트/실행하려면 Compile Online을 사용하고 있습니다. 이 발생 오류 : 괄호 한 쌍의 네 번째 행에서 누락

$gosh main.scheme 

gosh: "error": pair required, but got a 

답변

2

,이 시도 :보다

(define (num_items X) 
    (cond 
    ((null? X) 0) 
    ((list? (car X)) (+ (num_items (car X)) (num_items (cdr X)))) 
    (else (+ 1 (num_items (cdr X)))))) 

기타, 코드가 괜찮습니다. 단지 작은 제안 : 괄호를 별도의 줄로 닫지 말고 끝에 모두 닫습니다. 또한 list?pair? (또는 cons?)으로 바꿀 수 있습니다 (통역사에서 사용할 수있는 언어에 따라 다름). 값이 목록이면 테스트하는 것보다 비용이 적습니다.

관련 문제