Math 找到;简明数学定义“;函数在SICP中的应用
计算机程序的结构和解释实现了Ackermann的功能:Math 找到;简明数学定义“;函数在SICP中的应用,math,scheme,sicp,Math,Scheme,Sicp,计算机程序的结构和解释实现了Ackermann的功能: (define (A x y) (cond ((= y 0) 0) ((= x 0) (* 2 y)) ((= y 1) 2) (else (A (- x 1) (A x (- y 1)))))) 练习1.10要求对调用A的下列函数进行“简明数学定义”: (define (f n) (A 0 n)) (define (g n) (A 1 n)) (define (h n) (A 2 n))
(define (A x y)
(cond ((= y 0) 0)
((= x 0) (* 2 y))
((= y 1) 2)
(else (A (- x 1) (A x (- y 1))))))
练习1.10要求对调用A
的下列函数进行“简明数学定义”:
(define (f n) (A 0 n))
(define (g n) (A 1 n))
(define (h n) (A 2 n))
整数1-4的
f
和g
输出可识别为2n和2^n。但是h
是2^(2^n-1)
,仅仅通过在输出中寻找模式,我无法识别这个公式。如何完成这个练习?有没有一种方法可以推导出数学符号,也许是基于阿克曼函数的符号?已经计算出(fn)=(*2n)和(gn)=(expt2n),我们可以使用这些信息以及a的定义来计算出(a2n)是什么:
输入x=2:
(define (A2 y)
(cond ((= y 0) 0)
((= y 1) 2)
(else (A 1 (A2 (- y 1))))))
输入事实(a1n)=(expt2n)
由此可以更清楚地看到递归模式,A2给出了2的嵌套幂,比如2^(2^(2^2))。我认为您的答案2^(2^n-1)可能是错误的。您可以使用scheme本身来帮助找到以下问题的答案:
(define (*^ x y) `(* ,x ,y))
(define (A x y)
(cond ((= y 0) 0)
((= x 0) (*^ 2 y))
((= y 1) 2)
(else (A (- x 1) (A x (- y 1))))))
;> (A 0 100)
;'(* 2 100)
;> (A 0 234)
;'(* 2 234)
建议(A0N)=(*2N)
重新排序规则以避免错误。我们可以看到它做了*2N次,所以是2^n
这证实了我们得到一个指数塔的想法。这本书已经介绍了替代法,所以使用它没有错 从
(A 0 n)
这是
(cond ((= n 0) 0)
((= 0 0) (* 2 n))
((= 0 1) 2)
(else (A (- 0 1) (A 0 (- n 1)))))
这显然是2n
接下来,(a1n)
是
(cond ((= n 0) 0)
((= 1 0) (* 2 n))
((= n 1) 2)
(else (A (- 1 1) (A 1 (- n 1))))))
那是
(A 0 (A 1 (- n 1)))
或者,利用上一步
(* 2 (A 1 (- n 1))
就是
A 1 n = 2 * (A 1 (n-1))
= 2 * 2 * (A 1 (n-2))
= ...
因为我们知道对于所有的x
,都是ax1=2
,所以我们看到
A 1 n = 2 * 2 * ... * 2
具有n
因子,即2n
将类似的推理应用于最后一个案例作为练习。谢谢,这正是我想要的解释。这有一个“简明”的数学定义吗?
(* 2 (A 1 (- n 1))
A 1 n = 2 * (A 1 (n-1))
= 2 * 2 * (A 1 (n-2))
= ...
A 1 n = 2 * 2 * ... * 2