Вопрос, связанный с ракеткой - PullRequest
0 голосов
/ 01 сентября 2011
 (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 Ответ

2 голосов
/ 01 сентября 2011

Это (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 для добавления двоичных цифр.)

...