在方案中,新的乘法函数是:
( define ( iter b a n)
( cond (( = b 0) n)
(( even? b) ( iter ( / b 2) ( * 2 a) n))
( else ( iter ( - b 1) ( / ( * a b) ( - b 1)) ( + a ( * a ( - b 1)))))))
( define ( mul b a)
( iter b a 1))
这道题要求我用迭代的方法而不是递归的方法来处理这个问题,我的思路如下:
for example: ( mul 2 3 )
b a n
begin: 2 3 1
1 : 1 6 1
2 : 0 6/0 6
显然,在步骤2中,a等于6/0。那应该是不可能的。但功能运行良好。有人能解释一下吗? Here is the example in an online Scheme interpreter.
最佳答案
不,该功能不能正常工作。复制该过程的新定义,再次运行它,您将看到错误:
(define (iter b a n)
(cond ((= b 0) n)
((even? b)
(iter (/ b 2) (* 2 a) n))
(else
(iter (- b 1) (/ (* a b) (- b 1)) (+ a (* a (- b 1)))))))
(define (mul b a)
(iter b a 1))
(mul 2 3)
=> /: division by zero
事实上,预期的解决方案更符合这些思路,请注意,必须特别小心,以防 b
为负数:
(define (iter a b n)
(cond ((zero? b) n)
((even? b)
(iter (+ a a) (/ b 2) n))
(else
(iter a (- b 1) (+ a n)))))
(define (mul a b)
(if (< b 0)
(- (iter a (- b) 0))
(iter a b 0)))
按照您的示例,以下是我们执行 (mul 2 3)
时每次迭代中参数的外观:
a b n
begin: 2 3 0
1 : 2 2 2
2 : 4 1 2
3 : 4 0 6
关于lisp - 我在Scheme中定义了一个新的乘法函数,我认为它应该是错误的,但是它有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19129520/