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

标签 recursion scheme lisp mit-scheme ackermann

<分区>

我找到了这个版本的 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 ...”。消息“object 2 is not applicable”的意思就是:m 等于 2,系统尝试将其应用于 (- n 1)。但是数字 2(“对象 2”)不是函数(“不适用”)。

关于recursion - 对象不适用于 MIT 方案(不同的阿克曼函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41510950/

相关文章:

php - 如何使用 php 将树状数组输出到列表中?

javascript - 对象嵌套属性访问

java - 线性递归如何工作?

lisp - 在列表中查找元素的 Scheme 函数是什么?

scheme - SublimeREPL 窗口的 MIT-Scheme

macros - 具有无限数量参数的 Racket 宏

lambda - 在一个函数中生成幂集,没有显式递归,并且只使用 Racket 中最简单的原语

Powershell:在特定创建时间范围内递归搜索驱动器或目录中的文件类型

macros - 使用宏创建新标识符

macros - 如何编写简单的 LISP 宏来返回指定形式的输出(来自形式列表)?