lisp - 我在Scheme中定义了一个新的乘法函数,我认为它应该是错误的,但是它有效

标签 lisp scheme sicp

在方案中,新的乘法函数是:

( 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/

相关文章:

list - 制作未绑定(bind)变量列表 (LISP)

functional-programming - 自学SICP你会用什么语言?

lisp - '(()) 和 (cons null null) 之间的区别

time-complexity - 什么是增长顺序以及如何计算它?

user-interface - 如何使用 Common Lisp (Clozure CL) 库?

deployment - 使用 asdf 我可以加载仅提供以前制作的 FASL 的系统吗

scheme - Scheme 中的多行注释 (RnRS)

scheme - 句子输出是垂直的,每个单词之间有换行符

scheme - 无法在 SICP 中运行 "count-change"代码

scheme - 将 r5rs 文件包含到 Racket 中的另一个文件中