計算機プログラムの構造と解釈[第2版]
(翔泳社)
ハロルド エイブルソン (著) ジュリー サスマン (著)
ジェラルド・ジェイ サスマン (著)
Harold Abelson (原著) Julie Sussman (原著)
Gerald Jay Sussman (原著) 和田 英一 (翻訳)
開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Scheme (プログラミング言語)
- Gauche (処理系)
計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力、オブジェクトおよび状態)、3.5(ストリーム)、3.5.3(ストリームパラダイムの開発)、対の無限のストリーム、問題 3.72.を解いてみる。
その他参考書籍
- Instructor's Manual to Accompany Structure & Interpretation of Computer Programs
- プログラミングGauche (Kahuaプロジェクト (著), 川合 史朗 (監修), オライリージャパン)
問題 3.72.
コード(BBEdit, Emacs)
sample72.scm
#!/usr/bin/env gosh ;; -*- coding: utf-8 -*- (load "./stream.scm") (define (merge-weighted pairs1 pairs2 weight) (cond ((stream-null? pairs1) pairs2) ((stream-null? pairs2) pairs1) (else (let ((pairs1car (stream-car pairs1)) (pairs2car (stream-car pairs2))) (if (< (weight pairs1car) (weight pairs2car)) (cons-stream pairs1car (merge-weighted (stream-cdr pairs1) pairs2 weight)) (cons-stream pairs2car (merge-weighted pairs1 (stream-cdr pairs2) weight))))))) (define (weighted-pairs s t weight) (cons-stream (list (stream-car s) (stream-car t)) (merge-weighted (stream-map (lambda (x) (list (stream-car s) x)) (stream-cdr t)) (weighted-pairs (stream-cdr s) (stream-cdr t) weight) weight))) (define pairs (weighted-pairs integers integers (lambda (pair) (+ (expt (car pair) 2) (expt (cadr pair) 2))))) (define (weighted pair) (+ (expt (car pair) 2) (expt (cadr pair) 2))) (define (pythagoras-three-filter s) (let ((scar (stream-car s)) (scdr (stream-cdr s))) (let ((scddr (stream-cdr scdr)) (weight (weighted scar))) (if (and (= weight (weighted (stream-car scdr))) (= weight (weighted (stream-car scddr)))) (cons-stream scar (pythagoras-three-filter (stream-filter (lambda (pair) (> (weighted pair) weight)) (stream-cdr scddr)))) (pythagoras-three-filter scdr))))) (define stream (pythagoras-three-filter pairs)) (define (enumerate-interval low high) (if (> low high) '() (cons low (enumerate-interval (+ low 1) high)))) (define (test stream start end) (for-each (lambda (n) (let ((pair (stream-ref stream n))) (print (weighted pair) " " pair))) (enumerate-interval start end))) (print "3通りの異なる方法で2つの平方数の和として書ける数") (test stream 0 9) (print "2つの平方数の和") (test pairs 0 500)
入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))
$ ./sample72.scm 3通りの異なる方法で2つの平方数の和として書ける数 325 (10 15) 425 (13 16) 650 (17 19) 725 (14 23) 845 (19 22) 850 (15 25) 925 (21 22) 1025 (20 25) 1105 (23 24) 1250 (25 25) 2つの平方数の和 2 (1 1) 5 (1 2) 8 (2 2) 10 (1 3) 13 (2 3) 17 (1 4) 18 (3 3) 20 (2 4) 25 (3 4) 26 (1 5) 29 (2 5) 32 (4 4) 34 (3 5) 37 (1 6) 40 (2 6) 41 (4 5) 45 (3 6) 50 (5 5) 50 (1 7) 52 (4 6) 53 (2 7) 58 (3 7) 61 (5 6) 65 (4 7) 65 (1 8) 68 (2 8) 72 (6 6) 73 (3 8) 74 (5 7) 80 (4 8) 82 (1 9) 85 (6 7) 85 (2 9) 89 (5 8) 90 (3 9) 97 (4 9) 98 (7 7) 100 (6 8) 101 (1 10) 104 (2 10) 106 (5 9) 109 (3 10) 113 (7 8) 116 (4 10) 117 (6 9) 122 (1 11) 125 (5 10) 125 (2 11) 128 (8 8) 130 (7 9) 130 (3 11) 136 (6 10) 137 (4 11) 145 (8 9) 145 (1 12) 146 (5 11) 148 (2 12) 149 (7 10) 153 (3 12) 157 (6 11) 160 (4 12) 162 (9 9) 164 (8 10) 169 (5 12) 170 (7 11) 170 (1 13) 173 (2 13) 178 (3 13) 180 (6 12) 181 (9 10) 185 (8 11) 185 (4 13) 193 (7 12) 194 (5 13) 197 (1 14) 200 (10 10) 200 (2 14) 202 (9 11) 205 (6 13) 205 (3 14) 208 (8 12) 212 (4 14) 218 (7 13) 221 (10 11) 221 (5 14) 225 (9 12) 226 (1 15) 229 (2 15) 232 (6 14) 233 (8 13) 234 (3 15) 241 (4 15) 242 (11 11) 244 (10 12) 245 (7 14) 250 (9 13) 250 (5 15) 257 (1 16) 260 (8 14) 260 (2 16) 261 (6 15) 265 (11 12) 265 (3 16) 269 (10 13) 272 (4 16) 274 (7 15) 277 (9 14) 281 (5 16) 288 (12 12) 289 (8 15) 290 (11 13) 290 (1 17) 292 (6 16) 293 (2 17) 296 (10 14) 298 (3 17) 305 (7 16) 305 (4 17) 306 (9 15) 313 (12 13) 314 (5 17) 317 (11 14) 320 (8 16) 325 (10 15) 325 (6 17) 325 (1 18) 328 (2 18) 333 (3 18) 337 (9 16) 338 (13 13) 338 (7 17) 340 (12 14) 340 (4 18) 346 (11 15) 349 (5 18) 353 (8 17) 356 (10 16) 360 (6 18) 362 (1 19) 365 (13 14) 365 (2 19) 369 (12 15) 370 (9 17) 370 (3 19) 373 (7 18) 377 (11 16) 377 (4 19) 386 (5 19) 388 (8 18) 389 (10 17) 392 (14 14) 394 (13 15) 397 (6 19) 400 (12 16) 401 (1 20) 404 (2 20) 405 (9 18) 409 (3 20) 410 (11 17) 410 (7 19) 416 (4 20) 421 (14 15) 424 (10 18) 425 (13 16) 425 (8 19) 425 (5 20) 433 (12 17) 436 (6 20) 442 (9 19) 442 (1 21) 445 (11 18) 445 (2 21) 449 (7 20) 450 (15 15) 450 (3 21) 452 (14 16) 457 (4 21) 458 (13 17) 461 (10 19) 464 (8 20) 466 (5 21) 468 (12 18) 477 (6 21) 481 (15 16) 481 (9 20) 482 (11 19) 485 (14 17) 485 (1 22) 488 (2 22) 490 (7 21) 493 (13 18) 493 (3 22) 500 (10 20) 500 (4 22) 505 (12 19) 505 (8 21) 509 (5 22) 512 (16 16) 514 (15 17) 520 (14 18) 520 (6 22) 521 (11 20) 522 (9 21) 530 (13 19) 530 (1 23) 533 (7 22) 533 (2 23) 538 (3 23) 541 (10 21) 544 (12 20) 545 (16 17) 545 (4 23) 548 (8 22) 549 (15 18) 554 (5 23) 557 (14 19) 562 (11 21) 565 (9 22) 565 (6 23) 569 (13 20) 577 (1 24) 578 (17 17) 578 (7 23) 580 (16 18) 580 (2 24) 584 (10 22) 585 (12 21) 585 (3 24) 586 (15 19) 592 (4 24) 593 (8 23) 596 (14 20) 601 (5 24) 605 (11 22) 610 (13 21) 610 (9 23) 612 (6 24) 613 (17 18) 617 (16 19) 625 (15 20) 625 (7 24) 626 (1 25) 628 (12 22) 629 (10 23) 629 (2 25) 634 (3 25) 637 (14 21) 640 (8 24) 641 (4 25) 648 (18 18) 650 (17 19) 650 (11 23) 650 (5 25) 653 (13 22) 656 (16 20) 657 (9 24) 661 (6 25) 666 (15 21) 673 (12 23) 674 (7 25) 676 (10 24) 677 (1 26) 680 (14 22) 680 (2 26) 685 (18 19) 685 (3 26) 689 (17 20) 689 (8 25) 692 (4 26) 697 (16 21) 697 (11 24) 698 (13 23) 701 (5 26) 706 (9 25) 709 (15 22) 712 (6 26) 720 (12 24) 722 (19 19) 724 (18 20) 725 (14 23) 725 (10 25) 725 (7 26) 730 (17 21) 730 (1 27) 733 (2 27) 738 (3 27) 740 (16 22) 740 (8 26) 745 (13 24) 745 (4 27) 746 (11 25) 754 (15 23) 754 (5 27) 757 (9 26) 761 (19 20) 765 (18 21) 765 (6 27) 769 (12 25) 772 (14 24) 773 (17 22) 776 (10 26) 778 (7 27) 785 (16 23) 785 (1 28) 788 (2 28) 793 (8 27) 793 (3 28) 794 (13 25) 797 (11 26) 800 (20 20) 800 (4 28) 801 (15 24) 802 (19 21) 808 (18 22) 809 (5 28) 810 (9 27) 818 (17 23) 820 (12 26) 820 (6 28) 821 (14 25) 829 (10 27) 832 (16 24) 833 (7 28) 841 (20 21) 842 (1 29) 845 (19 22) 845 (13 26) 845 (2 29) 848 (8 28) 850 (15 25) 850 (11 27) 850 (3 29) 853 (18 23) 857 (4 29) 865 (17 24) 865 (9 28) 866 (5 29) 872 (14 26) 873 (12 27) 877 (6 29) 881 (16 25) 882 (21 21) 884 (20 22) 884 (10 28) 890 (19 23) 890 (7 29) 898 (13 27) 900 (18 24) 901 (15 26) 901 (1 30) 904 (2 30) 905 (11 28) 905 (8 29) 909 (3 30) 914 (17 25) 916 (4 30) 922 (9 29) 925 (21 22) 925 (14 27) 925 (5 30) 928 (12 28) 929 (20 23) 932 (16 26) 936 (6 30) 937 (19 24) 941 (10 29) 949 (18 25) 949 (7 30) 953 (13 28) 954 (15 27) 962 (11 29) 962 (1 31) 964 (8 30) 965 (17 26) 965 (2 31) 968 (22 22) 970 (21 23) 970 (3 31) 976 (20 24) 977 (4 31) 980 (14 28) 981 (9 30) 985 (16 27) 985 (12 29) 986 (19 25) 986 (5 31) 997 (6 31) 1000 (18 26) 1000 (10 30) 1009 (15 28) 1010 (13 29) 1010 (7 31) 1013 (22 23) 1017 (21 24) 1018 (17 27) 1021 (11 30) 1025 (20 25) 1025 (8 31) 1025 (1 32) 1028 (2 32) 1033 (3 32) 1037 (19 26) 1037 (14 29) 1040 (16 28) 1040 (4 32) 1042 (9 31) 1044 (12 30) 1049 (5 32) 1053 (18 27) 1058 (23 23) 1060 (22 24) 1060 (6 32) 1061 (10 31) 1066 (21 25) 1066 (15 29) 1069 (13 30) 1073 (17 28) 1073 (7 32) 1076 (20 26) 1082 (11 31) 1088 (8 32) 1090 (19 27) 1090 (1 33) 1093 (2 33) 1096 (14 30) 1097 (16 29) 1098 (3 33) 1105 (23 24) 1105 (12 31) 1105 (9 32) 1105 (4 33) 1108 (18 28) 1109 (22 25) 1114 (5 33) 1117 (21 26) 1124 (10 32) 1125 (15 30) 1125 (6 33) 1129 (20 27) 1130 (17 29) 1130 (13 31) 1138 (7 33) 1145 (19 28) 1145 (11 32) 1152 (24 24) 1153 (8 33) 1154 (23 25) 1156 (16 30) 1157 (14 31) 1157 (1 34) 1160 (22 26) 1160 (2 34) 1165 (18 29) 1165 (3 34) 1168 (12 32) 1170 (21 27) 1170 (9 33) 1172 (4 34) 1181 (5 34) 1184 (20 28) 1186 (15 31) 1189 (17 30) 1189 (10 33) 1192 (6 34) 1193 (13 32) 1201 (24 25) 1202 (19 29) 1205 (23 26) 1205 (7 34) 1210 (11 33) 1213 (22 27) 1217 (16 31) 1220 (14 32) 1220 (8 34) 1224 (18 30) 1225 (21 28) 1226 (1 35) 1229 (2 35) 1233 (12 33) 1234 (3 35) 1237 (9 34) 1241 (20 29) 1241 (4 35) 1249 (15 32) 1250 (25 25) 1250 (17 31) 1250 (5 35) 1252 (24 26) 1256 (10 34) 1258 (23 27) 1258 (13 33) 1261 (19 30) 1261 (6 35) 1268 (22 28) 1274 (7 35) 1277 (11 34) 1280 (16 32) 1282 (21 29) 1285 (18 31) 1285 (14 33) 1289 (8 35) $
0 コメント:
コメントを投稿