2016-10-25 5 views
3

클래스의 경우, 양의 정수 n을 사용하고 scheme의 n의 홀수 자릿수를 반환하는 함수를 작성해야합니다. 지금까지, n이 0이고 0 인 경우 기본 케이스가 있습니다. 그러나 계속하는 방법은 확실하지 않습니다.숫자의 홀수 자릿수를 반환하십시오.

(define sumOddDigits 
    (lambda (n) 
     (if (= n 0) 
      0 

테스트 케이스 :

(sumOddDigits 0) → 0 
(sumOddDigits 4) → 0 
(sumOddDigits 3) → 3 
(sumOddDigits 1984) → 10 

답변

0

당신은 그것을 효율적으로 하나 개의 기능 루프를 사용 할 수있는 :

(define (sumOddDigits n) 
    (let loop ([n n]) 
    (cond [(zero? n) 0] 
      [else 
      (let-values ([(q r) (quotient/remainder n 10)]) 
      (+ (if (odd? r) r 0) 
       (loop q)))]))) 
0

하나 '라는 이름하자'를 사용하여 다음과 같은 기능을 사용하여 숫자의 목록을 얻을 수 있습니다 :

(define (getDigits n) 
    (let loop ((ol '())   ; start with an empty outlist 
       (n n)) 
     (let-values (((q r) (quotient/remainder n 10))) 
     (if (= q 0) (cons r ol) 
      (loop (cons r ol) q))))) 

그런 다음 홀수를 사용하여 필터를 적용 할 수 있습니까? 기능은 모든 요소를 ​​추가 적용 '적용'다음 '+'와 기능을 목록 - 모든 홀수 요소를 얻을하기 :

(apply + (filter 
      (lambda(x) 
       (odd? x)) 
      digitList)) 

함께 전체 기능을 할 수 있습니다 다음

(define (addOddDigits N) 

    (define (getDigits n) 
    (let loop ((ol '()) 
       (n n)) 
     (let-values (((q r) (quotient/remainder n 10))) 
     (if (= q 0) (cons r ol) 
      (loop (cons r ol) q))))) 

    (define digitList (getDigits N)) 

    (println digitList) 

    (apply + (filter 
      (lambda(x) 
       (odd? x)) 
      digitList))) 

테스트 :

(addOddDigits 156) 

출력 :

'(1 5 6) 
6 
0

당신의 기본 케이스는 n < 인 경우입니다. 그러면 마지막 숫자가 표시됩니다. 그런 다음 이상이 없는지 확인하고, 그렇지 않으면 반환해야합니다. 그렇지 않으면 추가 한정자 (0)를 반환합니다.

n> 10 인 경우 첫 번째 자릿수를 나머지 수만큼 남겨두고 이상이 없는지 테스트합니다. 홀수 인 경우 재귀 호출에 추가하고 10의 지수로 보낸다 (방금 추가 한 숫자를 제외). 그렇지 않으면 현재 자릿수를 추가하지 않고 몫이 10 인 덧셈을 재귀 적으로 호출합니다.

여기

가 재귀 형태 (반응식 사랑 재귀)

(define add-odds 
    (lambda (n) 
    (if(< n 10) 
     (if(= (remainder n 2) 1) 
      n 
      0) 
     (if(= (remainder (remainder n 10) 2) 1) 
      (+ (remainder n 10) (add-odds (quotient n 10))) 
      (add-odds(quotient n 10)))))) 
관련 문제