【SICP习题3.66解答】全网唯一正确的解答!!
drracket吧
全部回复
仅看楼主
level 11
http://community.schemewiki.org/?sicp-ex-3.66
请看zzd3zzd的解答。(算的时候把m,n放颠倒了,算的时候注意哦。)
------------------------------------------------------------------------------------------
1.题目。
2.数目校验程序。
3.推理过程。
2014年04月04日 08点04分 1
level 11
练习3.66
请仔细检查流 (pairs integers integers),你能对各个序对放入在流中顺序做出任何一般性说明吗?比如说,在序对(1,100)之前大约有多少个序对?在序对(100,100)之前呢?(如果你能在这里做出精确的数学描述,那当然更好了。但如果觉得很难做到定量的回答,你也完全不必感到沮丧。)
2014年04月04日 09点04分 2
level 11
;;ex3.66
;;(pairs stream-integers stream-integers)
;;精确的数学描述 (pairs n m) 前有多少元素
;;练习 (1,100) (100,100)
(define (stream-integers-starting-from n)
(cons-stream n (stream-integers-starting-from (+ n 1))))
(define stream-integers
(stream-integers-starting-from 1))
(define p-int-int (stream-pairs stream-integers stream-integers))
(define (pairs-count n m)
(let loop ((i 0) (count 1))
(let ((result (stream-ref p-int-int i)))
(cond ((and (= (car result) n)
(= (cadr result) m))
count)
(else
(loop (add1 i) (add1 count)))))))
;-----------------------------------
(pairs-count 3 7);35
(pairs-count 1 100);198
(pairs-count 10 10);1023
(pairs-count 10 15);5631
2014年04月04日 09点04分 3
level 11
推理过程截图:
2014年04月04日 09点04分 4
那个meteorgan解答了许多问题很厉害。。。不过好多都是错的。。。大家看解答的时候要自己思考并独立验证结果。另外,我的解答也不一定是完全正确的,所有有错误请各位补充正确的答案。
2014年04月04日 09点04分
level 11
验证程序结果,公式匹配验证
测试结果及标准答案,现在用公式验证。
(pairs-count 3 7);35
(pairs-count 1 100);198
(pairs-count 10 10);1023
(pairs-count 10 15);5631
--------------------------------------------------
公式:(这里m和n顺序注意了,推的时候没注意[汗],那就反着吧。)
f(n,m) m>=n (m,n is Z+)
1.(m-n=0): 2^n - 1
2.(m-n=1): (2^n - 1) + 2^(n - 1)
3.(m-n>1): (2^n - 1) + 2^(n - 1) + (m - n - 1) * 2^n
----------------------------------------------
f(3 7) : n = 3,m=7 使用分段3
7 + 4 + 3 * 8 = 35
---
f(1 100) : n=1, m=100 使用分段3
1 + 1 + 98 * 2 = 198
---
f(10 10): n=10,m=10 使用分段1
2^10 - 1 = 1024 - 1 =1023
---
f(10 15): n=10,m=15 使用分段3
1023 + 512 + 4 * 1024 = 5631
---------------------------
验证完毕!
由于是无穷数列无法完全验证。
如果有反例,谢谢指正!!
2014年04月04日 09点04分 5
level 11
stream-interleave 和 stream-pairs 代码 定义补充。
--------------------------------
(define (stream-interleave s1 s2)
(if (stream-null? s1)
s2
(cons-stream (stream-car s1)
(stream-interleave s2 (stream-cdr s1)))))
---------------------------------
(define (stream-pairs s t)
(cons-stream
(list (stream-car s) (stream-car t))
(stream-interleave
(stream-map (lambda (x) (list (stream-car s) x))
(stream-cdr t))
(stream-pairs (stream-cdr s) (stream-cdr t)))))
2014年04月04日 09点04分 6
level 2
天天看你自问自答,突然感觉好寂寞的一群人啊!~
2014年04月16日 09点04分 7
嘿嘿,我只是没事操练操练,顺便把做过的都记录一下~~~ 欢迎到 drracket 吧来玩~~~
2014年04月16日 09点04分
level 1
楼主,有没有ESSENTIALS OF PROGRAMMING LANGUAGES这本书的答案啊。。。
快被professor弄死了。。。求助。
2014年04月23日 13点04分 8
木有啊~~~只能自己做。 有问题发帖问吧~~~或者去群里讨论~~~[乖]
2014年04月23日 14点04分
回复 zzd3zzd :吧主是不是能帮我一下呢?
2014年04月23日 15点04分
1