我找到了这个版本的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不适用
解决方案是什么?
答案 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”)不是一个函数(“不适用”)。