0

我找到了 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 不适用

解决方案是什么?

4

1 回答 1

2

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

(acker2 (m (- n 1)))

这应该是:

(acker2 m (- n 1))

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

于 2017-01-06T17:37:30.063 回答