2011-09-01 74 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

好的,我添加了一個二進制數字版本。請享用! (尚未測試) –