2011-09-01 96 views
0
(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 

在右边的注释中,给出了乘法算法的一些伪代码。左边是我试图在实际代码中实现所述算法,以两个二进制数字列表作为参数(从左到右,而不是从右到左)。运行时遇到一个错误,该错误说明了“procedure application:expected procedure”中的某些内容,给定为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)))))) 

A-字面翻译少可以使代码稍微更具可读性:

(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做二进制位数加法。)

+0

感谢您的答复。我忘了提及这个函数并不需要两个整数作为输入,而是两个二进制数字列表(从左到右,而不是从右到左)。我很抱歉,因为这是一个非常大的细节。 使用缺点是因为从我的理解中,在列表的前面添加一个零就会使列表乘以两。 –

+0

哇。好吧,我们来看看.... :-) –

+0

好的,我添加了一个二进制数字版本。请享用! (尚未测试) –