Recursion &引用;“任意精度数字的乘法”;计划中

Recursion &引用;“任意精度数字的乘法”;计划中,recursion,scheme,set,append,arbitrary-precision,Recursion,Scheme,Set,Append,Arbitrary Precision,下面是一个我已经研究了几天的问题的代码。我遇到的问题是,出于某种原因,当我打电话时: (apa-multi '(7 3 1 2) '(6 1 4)) (apa-multi '(3 1 2) '(6 1 4)) 报税表为: '(4 8 9 5 6 8) 它应该输出的答案是 '(4 4 8 9 5 6 8) 当我打电话时: (apa-multi '(7 3 1 2) '(6 1 4)) (apa-multi '(3 1 2) '(6 1 4)) 输出为: '(1 9 1 5 6 8)

下面是一个我已经研究了几天的问题的代码。我遇到的问题是,出于某种原因,当我打电话时:

(apa-multi '(7 3 1 2) '(6 1 4))
(apa-multi '(3 1 2) '(6 1 4))
报税表为:

'(4 8 9 5 6 8)
它应该输出的答案是

'(4 4 8 9 5 6 8)
当我打电话时:

(apa-multi '(7 3 1 2) '(6 1 4))
(apa-multi '(3 1 2) '(6 1 4))
输出为:

 '(1 9 1 5 6 8)
这是正确的

我已经多次调试我的代码,但我似乎无法找出问题所在(顺便说一句,我知道我编写的“removempty”函数很可能是不必要的)有人能告诉我哪里出了问题吗?(我解决这个问题的目标是将任意精度的数字保持在列表格式,并且我无法创建一个函数来转换列表->数值或数值->列表中的数字。)我相信我已经为某人提供了所有必要的代码来计算我的目标,如果没有,请告诉我。我得到的提示是“d=dndn的乘法−1…d1乘e=emem−1…e1可通过规则de=d执行∗e1+10∗(d)∗嗯嗯−1…e2)。”


代码无法工作的原因是apa add已损坏。例如:

> (apa-add '(7 3 1 2) '(6 1 4))
'(9 2 6)
> (+ 7312 614)
7926
如果您使用的是有效的apa add,那么代码的其余部分似乎可以工作,至少对于您的两个示例是这样

我承认我没有试图完全理解你的代码;糟糕的格式和设置!最后的程序让我想从头开始。所以,即使你可以简单地更正你的apa添加,也许还是可以看看我的版本,因为它要短得多,可能更容易理解

在我之前关于乘法的回答的基础上,我将apa相加,一次将一个列表乘以一个数字,然后在中间乘法的末尾添加零,就像手动操作一样:

(define (car0 lst) (if (empty? lst) 0 (car lst)))
(define (cdr0 lst) (if (empty? lst) empty (cdr lst)))

(define (apa-add l1 l2) ; apa-add (see https://stackoverflow.com/a/19597007/1193075)
  (let loop ((l1 (reverse l1)) (l2 (reverse l2)) (carry 0) (res '()))
    (if (and (null? l1) (null? l2) (= 0 carry)) 
        res
        (let* ((d1 (car0 l1)) (d2 (car0 l2)) (ad (+ d1 d2 carry)) (dn (modulo ad 10)))
          (loop (cdr0 l1) (cdr0 l2) (quotient (- ad dn) 10) (cons dn res))))))

(define (mult1 n lst) ; multiply a list by one digit
  (let loop ((lst (reverse lst)) (carry 0) (res '()))
    (if (and (null? lst) (= 0 carry))
        res
        (let* ((c (car0 lst)) (m (+ (* n c) carry)) (m0 (modulo m 10)))
          (loop (cdr0 lst) (quotient (- m m0) 10) (cons m0 res))))))

(define (apa-multi l1 l2) ; full multiplication
  (let loop ((l2 (reverse l2)) (app '()) (res '()))
    (if (null? l2) 
        res
        (let* ((d2 (car l2)) (m (mult1 d2 l1)) (r (append m app)))
          (loop (cdr l2) (cons '0 app) (apa-add r res))))))

不知道为什么它不起作用,所有这些附加物和反面都很难理解,也不知道所有这些设置到底是怎么回事!东西将状态放在尾部调用中要容易得多,而且通常引导效率更高

   (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)))))



       (define (apa-mult . Lists)
            (define (mult-by-factor n order L)
              (let loop ((order order) (L (reverse L)) (carry 0) (sum '()))
                (cond ((> order 0) (loop (- order 1) L carry (cons 0 sum)))
                      ((null? L) (if (zero? carry) 
                                     sum 
                                     (cons carry sum))) ;;bug here if carry > 9
                      (else (loop 0 
                                  (cdr L) 
                                  (quotient (+ carry (* n (car L))) 10) 
                                  (cons (modulo (+ carry (* n (car L))) 10) sum))))))
             (define (apa-mult2 L1 L2)
               (let ((rL1 (reverse L1))
                     (rL2 (reverse L2))
                     (zip-with-order
                        (lambda (L) 
                          (let loop ((order 0) (L L) (accum '()))
                             (if (null? L) 
                                 accum
                                 (loop (+ 1 order) 
                                       (cdr L)  
                                       (cons (cons (car L) order) accum)))))))
                   (fold apa-add '(0) (map (lambda (x) 
                                              (mult-by-factor (car x) (cdr x) L2))
                                           (zip-with-order rl1)))))
            (fold apa-mult2 '(1) Lists)))
(apa mult’(3 1 2’(6 1 4)))

);值7:(191568)

(apa mult(200)(31 2)(61 4))

);值8:(38313600)

(apa mult(7 3 1 2)(6 1 4))


);值9:(4 4 8 9 5 6 8)

它反转列表,我不知道scheme已经为列表定义了反转函数。