计算机程序的构造和解释 练习题2.5

如果要组成序对,car和cdr返回的a和b值必须唯一,题目可以理解为,如果一个整数由2^a 和 3^b表示,那么a和b的值肯定是唯一的。
我们可以利用反证法证明这个命题,证明过程如下
设 有 两 组 值 a 1 、 b 1 和 a 2 、 b 2 都 能 组 成 整 数 N , 且 a 1 ≠ a 2 、 b 1 ≠ b 2 则 N = 2 a 1 ∗ 3 b 1 N = 2 a 2 ∗ 3 b 2 2 a 1 ∗ 3 b 1 = 2 a 2 ∗ 3 b 2 2 a 1 − a 2 = 3 b 2 − b 1 如 果 2 n 次 方 和 3 m 次 方 能 相 等 , 则 n = m = 0 则 a 1 − a 2 = b 2 − b 1 = 0 所 以 a 1 = a 2 b 1 = b 2 这 与 假 设 a 1 ≠ a 2 、 b 1 ≠ b 2 矛 盾 , 所 以 命 题 成 立 设有两组值a_1、b_1和a_2、b_2都能组成整数N,且a_1\neq a_2、b_1\neq b_2则\\ N=2^{a_1}*3^{b_1}\\ N=2^{a_2}*3^{b_2}\\ 2^{a_1}*3^{b_1}=2^{a_2}*3^{b_2}\\ 2^{a_1-a_2}=3^{b_2-b_1}\\ 如果2^n次方和3^m次方能相等,则n=m=0\\ 则a_1-a_2=b_2-b_1=0\\ 所以a_1=a_2\\ b_1=b_2\\ 这与假设a_1\neq a_2、b_1\neq b_2矛盾,所以命题成立 a1b1a2b2Na1=a2b1=b2N=2a13b1N=2a23b22a13b1=2a23b22a1a2=3b2b12n3m,n=m=0a1a2=b2b1=0a1=a2b1=b2a1=a2b1=b2
这个其实是算数基本定理的一个特例。
算数基本定理是:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积
N = P 1 a 1 ∗ P 2 a 2 ∗ P 3 a 3 . . . . . . ∗ P n a n , N=P1^{a_1}*P2^{a_2}*P3^{a_3}......*Pn^{a_n}, N=P1a1P2a2P3a3......Pnan
这里P1<P2<P3…<Pn均为质数,其中指数ai是正整数。证明过程大家自己去搜索把。
给出最终过程

(define (cons a b)
  (* (expt 2 a) (expt 3 b)))

(define (car n)
  (define (iter a)
    (if (= (remainder n (expt 2 a)) 0) (iter (+ a 1)) (- a 1)))
  (iter 1))

(define (cdr n)
  (define (iter b)
    (if (= (remainder n (expt 3 b)) 0) (iter (+ b 1)) (- b 1)))
  (iter 1))

(car (cons 5 6))
(cdr (cons 4 10))

运算结果

5
10

当然car、cdr也可以用一次一次的除2或者3来计数实现,那种可能更合理点,毕竟按照之前题目的要求,在计算过程中,不断地缩小运算参数的大小,会提高程序的运行效率和降低运算程序所需的空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值