对象不适用于 MIT 方案(不同的阿克曼函数)

Object not applicable in MIT Scheme (a different Ackermann's function)

我找到了这个版本的 Ackermann 函数并尝试用 MIT Scheme Lisp 编写它但没有成功:

The Ackermann Function A(m,n)

When m=0

A(m,n)=n+1

When m>0 and n=0

A(m,n)=A(m-1,1)

When m>0 and 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 不适用

有什么解决办法?

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

(acker2 (m (- n 1)))

这应该是:

(acker2 m (- n 1))

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