球拍相关的问题

时间:2011-09-01 18:34:53

标签: scheme racket

 (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”。在其中看到的其他功能完全靠自己。

任何人都可以向我提供正确方向的暗示或推动吗?

1 个答案:

答案 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来进行二进制数字添加。)