2013-10-23 1 views
1

목록 형식을 보존하면서 scheme에 두 개의 숫자를 함께 추가하려고합니다. 그러나 계산에 사용되는 숫자가 10보다 크거나 같은 값을 더하면 원하지 않는 결과를 얻습니다. 예를 들어 :Scheme의 "임의의 정밀도 숫자 추가"

(define (reverse lst) 
    (if (null? lst) 
     '() 
     (append (reverse (cdr lst)) 
      (list (car lst))))) 

(define (apa-add lst1 lst2) 
    (cond ((null? lst1) lst2) 
    ((null? lst2) lst1) 
    ((>= (+ (car lst1) (car lst2)) 10) 
    (append (apa-add (cdr lst1) (cdr lst2)) 
     (list (quotient(+ (car lst1) (car lst2)) 10)) 
     (list (modulo (+ (car lst1) (car lst2)) 10)))) 
     (else 
     (append (apa-add (cdr lst1) (cdr lst2)) 
     (list (+ (car lst1) (car lst2))))))) 

(apa-add (reverse '(4 4 5)) (reverse'(3 5 8))) 

반환

'(7 9 1 3) 

어떻게하면이 오류를 해결하기 위해 내 코드를 수정할 수 있습니까? let 문을 사용하여 (quotient (+ (car lst1) (car lst2)) 10)의 평가를 다음 호출의 (list (+ (car lst1) (car lst2)))에 추가 할 수 있었지만이 방법을 생각할 수 없었습니다.

+0

예제에서 원하는 결과는 무엇입니까? – uselpa

+1

당신은 캐리 알고리즘으로 손으로 덧셈을 수행하는 절차를 원합니다, 그렇습니까? 그리고 당신은 돌아 오기를 원했습니다. '(8 0 3) 네? – WorBlux

+0

네, 원하는 출력입니다. –

답변

1

꼬리표로 만들면 사소한 일이 간단 해집니다.

(define (apa-add lst1 lst2) 
    (let loop ((carry 0) (L1 (reverse lst1)) (L2 (reverse lst2)) (sum '())) 
    (cond ((and (null? l1) (null? l2)) 
      (if (zero? carry) sum (cons carry sum))) 
      ((null? L1) 
      (loop (quotient (+ carry (car l2)) 10) 
        '() 
        (cdr L2) 
        (cons (modulo (+ carry (car l2)) 10) sum))) 
      ((null? L2) 
      (loop (quotient (+ carry (car l1)) 10) 
        (cdr l1) 
        '() 
        (cons (modulo (+ carry (car l1)) 10) sum))) 
      (else 
      (loop (quotient (+ carry (car l1) (car l2)) 10) 
        (cdr l1) 
        (cdr l2) 
        (cons (modulo (+ carry (car l1) (car l2)) 10) sum))))))    



(apa-add (list 4 4 5) (list 3 5 8)) 

;Value 4: (8 0 3) 

은 아마도 n-arity 기능으로 변환하기가 어렵지 않을 것입니다.

(define (apa-add . Lists) 
    (define (cdrs-no-null L) 
       (cond ((null? L) '()) 
        ((null? (cdar l)) (cdrs-no-null (cdr L))) 
        (else (cons (cdar l) (cdrs-no-null (cdr l)))))) 
    (let loop ((carry 0) (Lists (map reverse Lists)) (sum '())) 
      (if (null? Lists) 
       (if (zero? carry) sum (cons carry sum)) 
       (loop (quotient (fold + carry (map car Lists)) 10) 
        (cdrs-no-null Lists) 
        (cons (modulo (fold + carry (map car Lists)) 10) sum))))) 

(apa-add (list 4 4 5) (list 3 5 8) (list 1 0 2 7)) 

;Value 11: (1 8 3 0) 

(apa-add (list 4 4 5) (list 3 5 8)) 

;Value 12: (8 0 3)