对象不适用于MIT Scheme(不同的Ackermann函数)

时间:2017-01-06 17:25:44

标签: recursion scheme lisp mit-scheme ackermann

我找到了这个版本的Ackermann的功能,并尝试在MIT Scheme Lisp中编写代码并没有成功:

  

阿克曼函数A(m,n)

     

当m = 0

时      

A(M,N)= N + 1

     

当m> 0且n = 0时

     

A(M,N)= A(M-1,1)

     

当m> 0且n> 0

时      

A(M,N)= A(M-1,A(M,N-1))

(在此处http://www.gfredericks.com/sandbox/arith/ackermann

我的计划代码:

(define (acker2 m n)
        (cond ((= m 0)
               (+ n 1))
              ((and (> m 0)
                    (= n 0))
               (acker2 (- m 1)
                       1))
              ((and (> m 0)
                    (> n 0))
               (acker2 (- m 1)
                       (acker2 (m
                               (- n 1)))))))

现在有些结果:

(acker2 0 0) 价值:1

(acker2 0 1) 价值:2

(acker2 0 2) 价值:3

(acker2 2 2) 对象2不适用

(acker2 1 23) 对象1不适用

(acker2 8 0) 对象7不适用

解决方案是什么?

1 个答案:

答案 0 :(得分:2)

最后一个表达式中有一个错误(括号太多):

(acker2 (m (- n 1)))

这应该是:

(acker2 m (- n 1))

请记住,在Lisp / Scheme中(a b1 b2 ...)表示“将函数a应用于参数b1 b2 ...”。消息“对象2不适用”意味着:m等于2,系统会尝试将其应用于(- n 1)。但是数字2(“对象2”)不是一个函数(“不适用”)。

相关问题