2009-09-05 4 views
2

저는 Scheme의 초보자입니다. 질문을 용서하십시오. 숫자 목록의 계승을 계산하는 함수가 있지만, 그 숫자의 마지막 숫자 앞에 마침표가 나타납니다. 결과. 내가 어디로 잘못 가고 있니?Scheme Factorial (사실 * l) Question

코드 :

#lang scheme 

(define fact 
    (lambda (n) 
     (cond 
     ((= n 0) 1) 
     ((= n 1) 1) 
     (else (* n (fact (- n 1))))))) 

(define fact* 
    (lambda (l) 
    (cond 
     ((null? (cdr l)) (fact (car l))) 
     (else 
     (cons (fact (car l)) (fact* (cdr l))))))) 

출력 :

> (fact* '(3 6 7 2 4 5)) 
(6 720 5040 2 24 . 120) 

답변

8

무슨 짓을 한 것은 improper list을 만드는 것입니다. 이 시도 : 예상대로

(define fact* 
    (lambda (l) 
    (cond 
     ((null? (cdr l)) (list (fact (car l)))) 
     (else 
     (cons (fact (car l)) (fact* (cdr l))))))) 

네 번째 줄에있는 list의 추가가이 일을해야합니다. 더 나은은 다음과 같을 수 있습니다

(define fact* 
    (lambda (l) 
    (cond 
     (null? l) '()) 
     (else 
     (cons (fact (car l)) (fact* (cdr l))))))) 

이것은 당신의 fact* 기능을 사용하면 fact로 전화를 걸 장소의 수를 줄일뿐만 아니라, 빈리스트에 작업 할 수 있습니다.

+0

감사합니다. Scheme 프리미티브를 사용하여이를 수행 할 수있는 방법이 있습니까? 목록은 원시적입니까? – Isaac

+1

위 의견에 따라 두 번째 구현을 추가하기 위해 편집했습니다. 그 질문에 대답합니까? –

+0

아, 멋지다! 저의 "작은 교수자"지식은 잠시 잊혀졌습니다. 고맙습니다! – Isaac

1

cons 대신 append을 사용하십시오. cons은 쌍을 구성하는 데 사용되므로 "." 한 쌍의 요소를 분리하는 데 사용됩니다. 다음은 그 예이다 : 당신이 당신의 fact* 기능의 결과로 부적절한 목록을 왜

(define (factorial n) 
    (if (<= n 1) 
     1 
     (* n (factorial (- n 1))))) 

(define (factorial-list l) 
    (if (null? l) 
     '() 
     (append (list (factorial (car l))) 
       (factorial-list (cdr l))))) 
+0

확장 할 수 있습니까? 왜 정확히 "." 원자를 원소 목록으로 간주 할 때 내 목록에 삽입 되나요? – Isaac

+1

"쌍"은 두 개의 원자를 포함하는 객체입니다. "목록"은 목록의 끝이 "빈 목록"아톰에 의해 표시된다는 것을 제외하고는 각 쌍의'cdr '이 다른 목록 인 속성을 가진 쌍의 순서입니다. (cons 'a (cons'a '(c'))))')는 적절한리스트이지만'(cons 'a (cons'b 'c))'는 "부적절한리스트"라고 불린다. 두 번째 단점의'cdr'는 목록이 아닙니다. –

+1

최종 단계에서 목록과 원자로 구성된 쌍을 구성하기 때문에 예 :'(cons '(20 21) 120)'=>'((20 21). 120)'. 제대로 작동하게하려면 120을 목록으로 변환해야합니다. –

5

otheranswers는 이유를 지적했다. 난 단지 당신이 사용할 수 있음을 지적하고자하는 higher-order functionmap :

(define fact* 
    (lambda (l) 
    (map fact l)) 

(fact* '(3 6 7 2 4 5)) 

map 함수와 인수로 목록을 소요하고 새 목록을 생성, 목록에있는 모든 요소에 기능을 적용한다.