(define (mult a b) ;;function mult(a,b)
(cond
((IsItZero? b) 0) ;;if b = 0: return 0
((let((c (mult a (rest b)))) ;;c = mult(a, floor(b/2))
(if (= (first b) 0) ;;if b is even
(cons (0 c)) ;;return 2c else:
(addTogether(a cons(0 c)))))))) ;;return a + 2c
在右边的注释中,为乘法算法提供了一些伪代码。在左边是我试图在实际代码中实现所述算法,将两个二进制数字列表作为参数(从左到右,而不是从右到左)。我在运行它时遇到错误,说“程序应用:预期程序,给定:0;参数为:0”。在其中看到的其他功能完全靠自己。
任何人都可以向我提供正确方向的暗示或推动吗?
答案 0 :(得分:2)
它是(cons 0 c)
,而不是(cons (0 c))
。 :-)即便如此,cons
在这里是错误的方法。 : - )
以下是我的翻译方式:
(define (mult a b)
(if (zero? b) 0
(let ((c (mult a (quotient b 2))))
(if (even? b)
(* 2 c)
(+ a (* 2 c))))))
较少文字的翻译可以使代码更具可读性:
(define (mult a b)
(if (zero? b) 0
(let ((c (mult a (quotient b 2))))
(if (even? b)
(+ c c)
(+ a c c)))))
ETA:二进制数字版! (例如,4表示为'(0 0 1)
。)
(define (mult a b)
(if (null? b) '()
(let ((c (mult a (cdr b))))
(if (zero? (car b))
(cons 0 c)
(add a (cons 0 c))))))
(您必须实施add
来进行二进制数字添加。)