首页 > 解决方案 > Scheme中的阿克曼函数

问题描述

我已经设置了我的功能,但我不确定为什么它没有按我想要的方式工作。

(define (ack m n) (if (= m 0) (+ n 1)

           (if (and (> m 0) (= n 0)) (ack (- m 1) 1)
                          
                 (if (and (> m 0) (> n 0)) (ack (- m 1) (- n 1))))))

这就是我所关注的:

阿克曼函数

编辑:

(define (ack m n) 
   (if (= m 0) 
       (+ n 1)
       (if (and (> m 0) (= n 0)) 
           (ack (- m 1) 1)
           (if (and (> m 0) (> n 0)) 
               (ack (- m 1) (ack m (- n 1)))))))

我是个白痴,我在再次查看阿克曼函数后能够得到它

标签: schemeracket

解决方案


正确缩进代码有助于查看其结构是否正确:

(define (ack m n) 
   (if (= m 0) 
       (+ n 1)
       (if (and (> m 0) (= n 0)) 
           (ack (- m 1) 1)
           (if (and (> m 0) (> n 0)) 
               (ack (- m 1) (- n 1))
               ;; otherwise ......... what?
               ))))

一个if表达式最好有两个分支,即consequentalternate,否则如果测试失败并且没有备用,则在 R5RS 下结果是 undefined。而在 Racket 中,这种结构甚至是不合法的。

(那是在阅读你的代码之前,只是从它的结构来看)。


推荐阅读