Scheme 与球拍有关的问题
在右边的注释中,是一些为乘法算法提供的伪代码。左边是我在实数代码中实现上述算法的尝试,以两个二进制数字列表作为参数(从左到右,而不是从右到左)。我在运行它时遇到了一个错误,它的意思是“过程应用程序:预期的过程,给定:0;参数为:0”。其中的其他函数可以完全独立工作 有人能给我一个正确的提示或提示吗?这是Scheme 与球拍有关的问题,scheme,racket,Scheme,Racket,在右边的注释中,是一些为乘法算法提供的伪代码。左边是我在实数代码中实现上述算法的尝试,以两个二进制数字列表作为参数(从左到右,而不是从右到左)。我在运行它时遇到了一个错误,它的意思是“过程应用程序:预期的过程,给定:0;参数为:0”。其中的其他函数可以完全独立工作 有人能给我一个正确的提示或提示吗?这是(cons0c),而不是(cons0c)):-)即便如此,cons在这里也是错误的方法。:-) 我是这样翻译的: (define (mult a b) ;;
(cons0c)
,而不是(cons0c))
:-)即便如此,cons
在这里也是错误的方法。:-)
我是这样翻译的:
(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
减少直译可以使代码更具可读性:
(define (mult a b)
(if (zero? b) 0
(let ((c (mult a (quotient b 2))))
(if (even? b)
(* 2 c)
(+ a (* 2 c))))))
二进制数字版!(例如,其中4表示为
”(01)
)
(您必须实现
add
才能进行二进制数字加法。)谢谢您的回复。我忘了提到,函数不接受两个整数作为输入,而是两个二进制数字列表(从左到右,与正常的从右到左相反)。我道歉,因为这是一个相当大的细节。之所以使用Cons,是因为根据我的理解,在列表的前面加一个零,本质上就是将列表乘以2。享受吧!(尚未测试)非常感谢您的帮助;我能让它工作。正如您所指出的,我的主要问题是函数调用不正确
(define (mult a b)
(if (zero? b) 0
(let ((c (mult a (quotient b 2))))
(if (even? b)
(+ c c)
(+ a c c)))))
(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))))))