Ниже приведен код проблемы, над которой я работал несколько дней. Проблема, с которой я столкнулся, заключается в том, что по какой-то причине, когда я звоню:
(apa-multi '(7 3 1 2) '(6 1 4))
возврат:
'(4 8 9 5 6 8)
Ответ, который он должен вывести,
'(4 4 8 9 5 6 8)
Когда я звоню:
(apa-multi '(3 1 2) '(6 1 4))
Результат:
'(1 9 1 5 6 8)
что правильно.
Я несколько раз отлаживал свой код и никак не могу понять, в чем проблема (кстати, я знаю, что написанная мной функция "удалить-пусто", скорее всего, не нужна). Может ли кто-нибудь сказать мне, где я ошибаюсь? (Моя цель в этой проблеме — сохранить числа произвольной точности в формате списка, и я не могу создать функцию, которая преобразует числа из list-> num или num->list.) Я считаю, что предоставил весь необходимый код для того, чтобы кто-то понял, к чему я стремился, но если нет, пожалуйста, дайте мне знать. Подсказка, которую я имею для этого, заключается в том, что «Умножение d = dndn−1 ...d1 на e = emem−1 ...e1 может быть выполнено по правилу de=d∗e1 +10∗(d∗em em−1...e2).)"
(define (remove-empty L)
(define (remove-empty-h L accum)
(cond ((null? L) accum)
((null? (car L))
(remove-empty (cdr L)))
(else (cons (car L) (remove-empty-h (cdr L) accum)))))
(remove-empty-h L '()))
(define (apa-add lst1 lst2)
(define (apa-add-h lst1 lst2 carry)
(cond ((and (null? lst1) (null? lst2))
(if (not (= 0 carry))
(list carry)
'()))
((null? lst1) (append (apa-add-h lst1 '() carry)
(list (+ (car (reverse-l lst2)) carry))
(reverse-l(cdr (reverse-l lst2)))))
((null? lst2) (append (apa-add-h '() lst2 carry)
(list (+ (car (reverse-l lst1)) carry)))
(reverse-l(cdr (reverse-l lst1))))
(else
(append (apa-add-h (cdr lst1) (cdr lst2) (quotient (+ (car lst1) (car lst2) carry) 10))
(list (modulo (+ (car lst1) (car lst2) carry) 10))))))
(apa-add-h (reverse-l lst1) (reverse-l lst2) 0))
(define (d-multiply lst factor)
(define (d-multiply-h lst factor carry)
(cond ((null? lst) (if (= carry 0)
'()
(list carry)))
((>= (+ (* (car lst) factor) carry) 10)
(append ;(list (check-null-and-carry-mult lst carry))
(d-multiply-h (cdr lst) factor (quotient (+ (* (car lst) factor) carry) 10))
(list (modulo (+ (* (car lst) factor) carry) 10))))
(else (append ;(list (check-null-and-carry-mult lst carry))
(d-multiply-h (cdr lst) factor (quotient(+ (* (car lst) factor) carry) 10))
(list (+ (* (car lst) factor) carry))))))
(remove-empty (d-multiply-h (reverse-l lst) factor 0)))
(define (nlength l)
(if (null? l)
0
(+ 1 (nlength (cdr l)))))
(define (apa-multi d e)
(define temp '())
(cond ((= (max (nlength e) (nlength d)) (nlength e))
(set! temp e)
(set! e d)
(set! d temp))
(else
(set! temp d)
(set! d e)
(set! e temp)))
(define (apa-multi-h d e)
(cond ((null? e) (list 0))
(else (append (apa-add (d-multiply d (car e))
(append (apa-multi-h d (cdr e)) (list 0)))))))
(apa-multi-h d (reverse-l e)))