-
Notifications
You must be signed in to change notification settings - Fork 0
/
exercises-templates.scm
6162 lines (6162 loc) · 250 KB
/
exercises-templates.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
; {{{1 2.2.1 Representing Sequences
;
; {{{2 Exercise 2.17:
; {{{3 Problem
; Define a procedure `last-pair' that returns the
; list that contains only the last element of a given (nonempty)
; list:
;
; (last-pair (list 23 72 149 34))
; (34)
;
; {{{3 Solution
; {{{2 Exercise 2.18:
; {{{3 Problem
; Define a procedure `reverse' that takes a list as
; argument and returns a list of the same elements in reverse order:
;
; (reverse (list 1 4 9 16 25))
; (25 16 9 4 1)
;
; {{{3 Solution
; {{{2 Exercise 2.19:
; {{{3 Problem
; Consider the change-counting program of section
; *Note 1-2-2::. It would be nice to be able to easily change the
; currency used by the program, so that we could compute the number
; of ways to change a British pound, for example. As the program is
; written, the knowledge of the currency is distributed partly into
; the procedure `first-denomination' and partly into the procedure
; `count-change' (which knows that there are five kinds of U.S.
; coins). It would be nicer to be able to supply a list of coins to
; be used for making change.
;
; We want to rewrite the procedure `cc' so that its second argument
; is a list of the values of the coins to use rather than an integer
; specifying which coins to use. We could then have lists that
; defined each kind of currency:
;
; (define us-coins (list 50 25 10 5 1))
;
; (define uk-coins (list 100 50 20 10 5 2 1 0.5))
;
; We could then call `cc' as follows:
;
; (cc 100 us-coins)
; 292
;
; To do this will require changing the program `cc' somewhat. It
; will still have the same form, but it will access its second
; argument differently, as follows:
;
; (define (cc amount coin-values)
; (cond ((= amount 0) 1)
; ((or (< amount 0) (no-more? coin-values)) 0)
; (else
; (+ (cc amount
; (except-first-denomination coin-values))
; (cc (- amount
; (first-denomination coin-values))
; coin-values)))))
;
; Define the procedures `first-denomination',
; `except-first-denomination', and `no-more?' in terms of primitive
; operations on list structures. Does the order of the list
; `coin-values' affect the answer produced by `cc'? Why or why not?
;
; {{{3 Solution
; {{{2 Exercise 2.20:
; {{{3 Problem
; The procedures `+', `*', and `list' take
; arbitrary numbers of arguments. One way to define such procedures
; is to use `define' with notation "dotted-tail notation". In a
; procedure definition, a parameter list that has a dot before the
; last parameter name indicates that, when the procedure is called,
; the initial parameters (if any) will have as values the initial
; arguments, as usual, but the final parameter's value will be a "list"
; of any remaining arguments. For instance, given the definition
;
; (define (f x y . z) <BODY>)
;
; the procedure `f' can be called with two or more arguments. If we
; evaluate
;
; (f 1 2 3 4 5 6)
;
; then in the body of `f', `x' will be 1, `y' will be 2, and `z'
; will be the list `(3 4 5 6)'. Given the definition
;
; (define (g . w) <BODY>)
;
; the procedure `g' can be called with zero or more arguments. If we
; evaluate
;
; (g 1 2 3 4 5 6)
;
; then in the body of `g', `w' will be the list `(1 2 3 4 5 6)'.(4)
;
; Use this notation to write a procedure `same-parity' that takes
; one or more integers and returns a list of all the arguments that
; have the same even-odd parity as the first argument. For example,
;
; (same-parity 1 2 3 4 5 6 7)
; (1 3 5 7)
;
; (same-parity 2 3 4 5 6 7)
; (2 4 6)
;
; {{{3 Solution
; {{{2 Exercise 2.21:
; {{{3 Problem
; The procedure `square-list' takes a list of
; numbers as argument and returns a list of the squares of those
; numbers.
;
; (square-list (list 1 2 3 4))
; (1 4 9 16)
;
; Here are two different definitions of `square-list'. Complete
; both of them by filling in the missing expressions:
;
; (define (square-list items)
; (if (null? items)
; nil
; (cons <??> <??>)))
;
; (define (square-list items)
; (map <??> <??>))
;
; {{{3 Solution
; {{{2 Exercise 2.22:
; {{{3 Problem
; Louis Reasoner tries to rewrite the first
; `square-list' procedure of *Note Exercise 2-21:: so that it
; evolves an iterative process:
;
; (define (square-list items)
; (define (iter things answer)
; (if (null? things)
; answer
; (iter (cdr things)
; (cons (square (car things))
; answer))))
; (iter items nil))
;
; Unfortunately, defining `square-list' this way produces the answer
; list in the reverse order of the one desired. Why?
;
; Louis then tries to fix his bug by interchanging the arguments to
; `cons':
;
; (define (square-list items)
; (define (iter things answer)
; (if (null? things)
; answer
; (iter (cdr things)
; (cons answer
; (square (car things))))))
; (iter items nil))
;
; This doesn't work either. Explain.
;
; {{{3 Solution
; {{{2 Exercise 2.23:
; {{{3 Problem
; The procedure `for-each' is similar to `map'. It
; takes as arguments a procedure and a list of elements. However,
; rather than forming a list of the results, `for-each' just applies
; the procedure to each of the elements in turn, from left to right.
; The values returned by applying the procedure to the elements are
; not used at all--`for-each' is used with procedures that perform
; an action, such as printing. For example,
;
; (for-each (lambda (x) (newline) (display x))
; (list 57 321 88))
; 57
; 321
; 88
;
; The value returned by the call to `for-each' (not illustrated
; above) can be something arbitrary, such as true. Give an
; implementation of `for-each'.
;
; {{{3 Solution
;
; {{{1 2.2.2 Hierarchical Structures
;
; {{{2 Exercise 2.24:
; {{{3 Problem
; Suppose we evaluate the expression `(list 1 (list
; 2 (list 3 4)))'. Give the result printed by the interpreter, the
; corresponding box-and-pointer structure, and the interpretation of
; this as a tree (as in *Note Figure 2-6::).
;
; {{{3 Solution
; {{{2 Exercise 2.25:
; {{{3 Problem
; Give combinations of `car's and `cdr's that will
; pick 7 from each of the following lists:
;
; (1 3 (5 7) 9)
;
; ((7))
;
; (1 (2 (3 (4 (5 (6 7))))))
;
; {{{3 Solution
; {{{2 Exercise 2.26:
; {{{3 Problem
; Suppose we define `x' and `y' to be two lists:
;
; (define x (list 1 2 3))
;
; (define y (list 4 5 6))
;
; What result is printed by the interpreter in response to
; evaluating each of the following expressions:
;
; (append x y)
;
; (cons x y)
;
; (list x y)
;
; {{{3 Solution
; {{{2 Exercise 2.27:
; {{{3 Problem
; Modify your `reverse' procedure of *Note Exercise
; 2-18:: to produce a `deep-reverse' procedure that takes a list as
; argument and returns as its value the list with its elements
; reversed and with all sublists deep-reversed as well. For example,
;
; (define x (list (list 1 2) (list 3 4)))
;
; x
; ((1 2) (3 4))
;
; (reverse x)
; ((3 4) (1 2))
;
; (deep-reverse x)
; ((4 3) (2 1))
;
; {{{3 Solution
; {{{2 Exercise 2.28:
; {{{3 Problem
; Write a procedure `fringe' that takes as argument
; a tree (represented as a list) and returns a list whose elements
; are all the leaves of the tree arranged in left-to-right order.
; For example,
;
; (define x (list (list 1 2) (list 3 4)))
;
; (fringe x)
; (1 2 3 4)
;
; (fringe (list x x))
; (1 2 3 4 1 2 3 4)
;
; {{{3 Solution
; {{{2 Exercise 2.29:
; {{{3 Problem
; A binary mobile consists of two branches, a left
; branch and a right branch. Each branch is a rod of a certain
; length, from which hangs either a weight or another binary mobile.
; We can represent a binary mobile using compound data by
; constructing it from two branches (for example, using `list'):
;
; (define (make-mobile left right)
; (list left right))
;
; A branch is constructed from a `length' (which must be a number)
; together with a `structure', which may be either a number
; (representing a simple weight) or another mobile:
;
; (define (make-branch length structure)
; (list length structure))
;
; a. Write the corresponding selectors `left-branch' and
; `right-branch', which return the branches of a mobile, and
; `branch-length' and `branch-structure', which return the
; components of a branch.
;
; b. Using your selectors, define a procedure `total-weight' that
; returns the total weight of a mobile.
;
; c. A mobile is said to be "balanced" if the torque applied by
; its top-left branch is equal to that applied by its top-right
; branch (that is, if the length of the left rod multiplied by
; the weight hanging from that rod is equal to the
; corresponding product for the right side) and if each of the
; submobiles hanging off its branches is balanced. Design a
; predicate that tests whether a binary mobile is balanced.
;
; d. Suppose we change the representation of mobiles so that the
; constructors are
;
; (define (make-mobile left right)
; (cons left right))
;
; (define (make-branch length structure)
; (cons length structure))
;
; How much do you need to change your programs to convert to
; the new representation?
;
; {{{3 Solution
; {{{2 Exercise 2.30:
; {{{3 Problem
; Define a procedure `square-tree' analogous to the
; `square-list' procedure of *Note Exercise 2-21::. That is,
; `square-list' should behave as follows:
;
; (square-tree
; (list 1
; (list 2 (list 3 4) 5)
; (list 6 7)))
; (1 (4 (9 16) 25) (36 49))
;
; Define `square-tree' both directly (i.e., without using any
; higher-order procedures) and also by using `map' and recursion.
;
; {{{3 Solution
; {{{2 Exercise 2.31:
; {{{3 Problem
; Abstract your answer to *Note Exercise 2-30:: to
; produce a procedure `tree-map' with the property that
; `square-tree' could be defined as
;
; (define (square-tree tree) (tree-map square tree))
;
; {{{3 Solution
; {{{2 Exercise 2.32:
; {{{3 Problem
; We can represent a set as a list of distinct
; elements, and we can represent the set of all subsets of the set as
; a list of lists. For example, if the set is `(1 2 3)', then the
; set of all subsets is `(() (3) (2) (2 3) (1) (1 3) (1 2) (1 2
; 3))'. Complete the following definition of a procedure that
; generates the set of subsets of a set and give a clear explanation
; of why it works:
;
; (define (subsets s)
; (if (null? s)
; (list nil)
; (let ((rest (subsets (cdr s))))
; (append rest (map <??> rest)))))
;
; {{{3 Solution
;
; {{{1 2.2.3 Sequences as Conventional Interfaces
;
; {{{2 Exercise 2.33:
; {{{3 Problem
; Fill in the missing expressions to complete the
; following definitions of some basic list-manipulation operations
; as accumulations:
;
; (define (map p sequence)
; (accumulate (lambda (x y) <??>) nil sequence))
;
; (define (append seq1 seq2)
; (accumulate cons <??> <??>))
;
; (define (length sequence)
; (accumulate <??> 0 sequence))
;
; {{{3 Solution
; {{{2 Exercise 2.34:
; {{{3 Problem
; Evaluating a polynomial in x at a given value of
; x can be formulated as an accumulation. We evaluate the polynomial
;
; a_n r^n | a_(n-1) r^(n-1) + ... + a_1 r + a_0
;
; using a well-known algorithm called "Horner's rule", which
; structures the computation as
;
; (... (a_n r + a_(n-1)) r + ... + a_1) r + a_0
;
; In other words, we start with a_n, multiply by x, add a_(n-1),
; multiply by x, and so on, until we reach a_0.(3)
;
; Fill in the following template to produce a procedure that
; evaluates a polynomial using Horner's rule. Assume that the
; coefficients of the polynomial are arranged in a sequence, from
; a_0 through a_n.
;
; (define (horner-eval x coefficient-sequence)
; (accumulate (lambda (this-coeff higher-terms) <??>)
; 0
; coefficient-sequence))
;
; For example, to compute 1 + 3x + 5x^3 + x^(5) at x = 2 you would
; evaluate
;
; (horner-eval 2 (list 1 3 0 5 0 1))
;
; {{{3 Solution
; {{{2 Exercise 2.35:
; {{{3 Problem
; Redefine `count-leaves' from section *Note
; 2-2-2:: as an accumulation:
;
; (define (count-leaves t)
; (accumulate <??> <??> (map <??> <??>)))
;
; {{{3 Solution
; {{{2 Exercise 2.36:
; {{{3 Problem
; The procedure `accumulate-n' is similar to
; `accumulate' except that it takes as its third argument a sequence
; of sequences, which are all assumed to have the same number of
; elements. It applies the designated accumulation procedure to
; combine all the first elements of the sequences, all the second
; elements of the sequences, and so on, and returns a sequence of
; the results. For instance, if `s' is a sequence containing four
; sequences, `((1 2 3) (4 5 6) (7 8 9) (10 11 12)),' then the value
; of `(accumulate-n + 0 s)' should be the sequence `(22 26 30)'.
; Fill in the missing expressions in the following definition of
; `accumulate-n':
;
; (define (accumulate-n op init seqs)
; (if (null? (car seqs))
; nil
; (cons (accumulate op init <??>)
; (accumulate-n op init <??>))))
;
; {{{2 Exercise 2.37
;
; Suppose we represent vectors v = (v_i) as sequences of numbers, and
; matrices m = (m_(ij)) as sequences of vectors (the rows of the matrix).
; For example, the matrix
;
; +- -+
; | 1 2 3 4 |
; | 4 5 6 6 |
; | 6 7 8 9 |
; +- -+
;
; is represented as the sequence `((1 2 3 4) (4 5 6 6) (6 7 8 9))'. With
; this representation, we can use sequence operations to concisely
; express the basic matrix and vector operations. These operations
; (which are described in any book on matrix algebra) are the following:
;
; __
; (dot-product v w) returns the sum >_i v_i w_i
;
; (matrix-*-vector m v) returns the vector t,
; __
; where t_i = >_j m_(ij) v_j
;
; (matrix-*-matrix m n) returns the matrix p,
; __
; where p_(ij) = >_k m_(ik) n_(kj)
;
; (transpose m) returns the matrix n,
; where n_(ij) = m_(ji)
;
; We can define the dot product as(4)
;
; (define (dot-product v w)
; (accumulate + 0 (map * v w)))
;
; Fill in the missing expressions in the following procedures for
; computing the other matrix operations. (The procedure `accumulate-n'
; is defined in *Note Exercise 2-36::.)
;
; (define (matrix-*-vector m v)
; (map <??> m))
;
; (define (transpose mat)
; (accumulate-n <??> <??> mat))
;
; (define (matrix-*-matrix m n)
; (let ((cols (transpose n)))
; (map <??> m)))
;
; {{{3 Solution
; {{{2 Exercise 2.38:
; {{{3 Problem
; The `accumulate' procedure is also known as
; `fold-right', because it combines the first element of the
; sequence with the result of combining all the elements to the
; right. There is also a `fold-left', which is similar to
; `fold-right', except that it combines elements working in the
; opposite direction:
;
; (define (fold-left op initial sequence)
; (define (iter result rest)
; (if (null? rest)
; result
; (iter (op result (car rest))
; (cdr rest))))
; (iter initial sequence))
;
; What are the values of
;
; (fold-right / 1 (list 1 2 3))
;
; (fold-left / 1 (list 1 2 3))
;
; (fold-right list nil (list 1 2 3))
;
; (fold-left list nil (list 1 2 3))
;
; Give a property that `op' should satisfy to guarantee that
; `fold-right' and `fold-left' will produce the same values for any
; sequence.
;
; {{{3 Solution
; {{{2 Exercise 2.39:
; {{{3 Problem
; Complete the following definitions of `reverse'
; (*Note Exercise 2-18::) in terms of `fold-right' and `fold-left'
; from *Note Exercise 2-38:::
;
; (define (reverse sequence)
; (fold-right (lambda (x y) <??>) nil sequence))
;
; (define (reverse sequence)
; (fold-left (lambda (x y) <??>) nil sequence))
;
; {{{3 Solution
; {{{2 Exercise 2.40:
; {{{3 Problem
; Define a procedure `unique-pairs' that, given an
; integer n, generates the sequence of pairs (i,j) with 1 <= j< i <=
; n. Use `unique-pairs' to simplify the definition of
; `prime-sum-pairs' given above.
;
; {{{3 Solution
; {{{2 Exercise 2.41:
; {{{3 Problem
; Write a procedure to find all ordered triples of
; distinct positive integers i, j, and k less than or equal to a
; given integer n that sum to a given integer s.
;
; *Figure 2.8:* A solution to the eight-queens puzzle.
;
; +---+---+---+---+---+---+---+---+
; | | | | | | Q | | |
; +---+---+---+---+---+---+---+---+
; | | | Q | | | | | |
; +---+---+---+---+---+---+---+---+
; | Q | | | | | | | |
; +---+---+---+---+---+---+---+---+
; | | | | | | | Q | |
; +---+---+---+---+---+---+---+---+
; | | | | | Q | | | |
; +---+---+---+---+---+---+---+---+
; | | | | | | | | Q |
; +---+---+---+---+---+---+---+---+
; | | Q | | | | | | |
; +---+---+---+---+---+---+---+---+
; | | | | Q | | | | |
; +---+---+---+---+---+---+---+---+
;
; {{{3 Solution
; {{{2 Exercise 2.42:
; {{{3 Problem
; The "eight-queens puzzle" asks how to place eight
; queens on a chessboard so that no queen is in check from any other
; (i.e., no two queens are in the same row, column, or diagonal).
; One possible solution is shown in *Note Figure 2-8::. One way to
; solve the puzzle is to work across the board, placing a queen in
; each column. Once we have placed k - 1 queens, we must place the
; kth queen in a position where it does not check any of the queens
; already on the board. We can formulate this approach recursively:
; Assume that we have already generated the sequence of all possible
; ways to place k - 1 queens in the first k - 1 columns of the
; board. For each of these ways, generate an extended set of
; positions by placing a queen in each row of the kth column. Now
; filter these, keeping only the positions for which the queen in
; the kth column is safe with respect to the other queens. This
; produces the sequence of all ways to place k queens in the first k
; columns. By continuing this process, we will produce not only one
; solution, but all solutions to the puzzle.
;
; We implement this solution as a procedure `queens', which returns a
; sequence of all solutions to the problem of placing n queens on an
; n*n chessboard. `Queens' has an internal procedure `queen-cols'
; that returns the sequence of all ways to place queens in the first
; k columns of the board.
;
; (define (queens board-size)
; (define (queen-cols k)
; (if (= k 0)
; (list empty-board)
; (filter
; (lambda (positions) (safe? k positions))
; (flatmap
; (lambda (rest-of-queens)
; (map (lambda (new-row)
; (adjoin-position new-row k rest-of-queens))
; (enumerate-interval 1 board-size)))
; (queen-cols (- k 1))))))
; (queen-cols board-size))
;
; In this procedure `rest-of-queens' is a way to place k - 1 queens
; in the first k - 1 columns, and `new-row' is a proposed row in
; which to place the queen for the kth column. Complete the program
; by implementing the representation for sets of board positions,
; including the procedure `adjoin-position', which adjoins a new
; row-column position to a set of positions, and `empty-board',
; which represents an empty set of positions. You must also write
; the procedure `safe?', which determines for a set of positions,
; whether the queen in the kth column is safe with respect to the
; others. (Note that we need only check whether the new queen is
; safe--the other queens are already guaranteed safe with respect to
; each other.)
;
; {{{3 Solution
; {{{2 Exercise 2.43:
; {{{3 Problem
; Louis Reasoner is having a terrible time doing
; *Note Exercise 2-42::. His `queens' procedure seems to work, but
; it runs extremely slowly. (Louis never does manage to wait long
; enough for it to solve even the 6*6 case.) When Louis asks Eva Lu
; Ator for help, she points out that he has interchanged the order
; of the nested mappings in the `flatmap', writing it as
;
; (flatmap
; (lambda (new-row)
; (map (lambda (rest-of-queens)
; (adjoin-position new-row k rest-of-queens))
; (queen-cols (- k 1))))
; (enumerate-interval 1 board-size))
;
; Explain why this interchange makes the program run slowly.
; Estimate how long it will take Louis's program to solve the
; eight-queens puzzle, assuming that the program in *Note Exercise
; 2-42:: solves the puzzle in time T.
;
; {{{3 Solution
;
; {{{1 2.2.4 Example: A Picture Language
;
; {{{2 Exercise 2.44:
; {{{3 Problem
; Define the procedure `up-split' used by
; `corner-split'. It is similar to `right-split', except that it
; switches the roles of `below' and `beside'.
;
; {{{3 Solution
; {{{2 Exercise 2.45:
; {{{3 Problem
; `Right-split' and `up-split' can be expressed as
; instances of a general splitting operation. Define a procedure
; `split' with the property that evaluating
;
; (define right-split (split beside below))
; (define up-split (split below beside))
;
; produces procedures `right-split' and `up-split' with the same
; behaviors as the ones already defined.
;
; {{{3 Solution
; {{{2 Exercise 2.46:
; {{{3 Problem
; A two-dimensional vector v running from the
; origin to a point can be represented as a pair consisting of an
; x-coordinate and a y-coordinate. Implement a data abstraction for
; vectors by giving a constructor `make-vect' and corresponding
; selectors `xcor-vect' and `ycor-vect'. In terms of your selectors
; and constructor, implement procedures `add-vect', `sub-vect', and
; `scale-vect' that perform the operations vector addition, vector
; subtraction, and multiplying a vector by a scalar:
;
; (x_1, y_1) + (x_2, y_2) = (x_1 + x_2, y_1 + y_2)
; (x_1, y_1) - (x_2, y_2) = (x_1 - x_2, y_1 - y_2)
; s * (x, y) = (sx, sy)
;
; {{{3 Solution
; {{{2 Exercise 2.47:
; {{{3 Problem
; Here are two possible constructors for frames:
;
; (define (make-frame origin edge1 edge2)
; (list origin edge1 edge2))
;
; (define (make-frame origin edge1 edge2)
; (cons origin (cons edge1 edge2)))
;
; For each constructor supply the appropriate selectors to produce an
; implementation for frames.
;
; {{{3 Solution
; {{{2 Exercise 2.48:
; {{{3 Problem
; A directed line segment in the plane can be
; represented as a pair of vectors--the vector running from the
; origin to the start-point of the segment, and the vector running
; from the origin to the end-point of the segment. Use your vector
; representation from *Note Exercise 2-46:: to define a
; representation for segments with a constructor `make-segment' and
; selectors `start-segment' and `end-segment'.
;
; {{{3 Solution
; {{{2 Exercise 2.49:
; {{{3 Problem
; Use `segments->painter' to define the following
; primitive painters:
;
; a. The painter that draws the outline of the designated frame.
;
; b. The painter that draws an "X" by connecting opposite corners
; of the frame.
;
; c. The painter that draws a diamond shape by connecting the
; midpoints of the sides of the frame.
;
; d. The `wave' painter.
;
; {{{3 Solution
; {{{2 Exercise 2.50:
; {{{3 Problem
; Define the transformation `flip-horiz', which
; flips painters horizontally, and transformations that rotate
; painters counterclockwise by 180 degrees and 270 degrees.
;
; {{{3 Solution
; {{{2 Exercise 2.51:
; {{{3 Problem
; Define the `below' operation for painters.
; `Below' takes two painters as arguments. The resulting painter,
; given a frame, draws with the first painter in the bottom of the
; frame and with the second painter in the top. Define `below' in
; two different ways--first by writing a procedure that is analogous
; to the `beside' procedure given above, and again in terms of
; `beside' and suitable rotation operations (from *Note Exercise
; 2-50::).
;
; {{{3 Solution
; {{{2 Exercise 2.52:
; {{{3 Problem
; Make changes to the square limit of `wave' shown
; in *Note Figure 2-9:: by working at each of the levels described
; above. In particular:
;
; a. Add some segments to the primitive `wave' painter of *Note
; Exercise 2-49:: (to add a smile, for example).
;
; b. Change the pattern constructed by `corner-split' (for
; example, by using only one copy of the `up-split' and
; `right-split' images instead of two).
;
; c. Modify the version of `square-limit' that uses
; `square-of-four' so as to assemble the corners in a different
; pattern. (For example, you might make the big Mr. Rogers
; look outward from each corner of the square.)
;
; {{{3 Solution
;
; {{{1 2.3.1 Quotation
;
; {{{2 Exercise 2.53:
; {{{3 Problem
; What would the interpreter print in response to
; evaluating each of the following expressions?
;
; (list 'a 'b 'c)
;
; (list (list 'george))
;
; (cdr '((x1 x2) (y1 y2)))
;
; (cadr '((x1 x2) (y1 y2)))
;
; (pair? (car '(a short list)))
;
; (memq 'red '((red shoes) (blue socks)))
;
; (memq 'red '(red shoes blue socks))
;
; {{{3 Solution
; {{{2 Exercise 2.54:
; {{{3 Problem
; Two lists are said to be `equal?' if they contain
; equal elements arranged in the same order. For example,
;
; (equal? '(this is a list) '(this is a list))
;
; is true, but
;
; (equal? '(this is a list) '(this (is a) list))
;
; is false. To be more precise, we can define `equal?' recursively
; in terms of the basic `eq?' equality of symbols by saying that `a'
; and `b' are `equal?' if they are both symbols and the symbols are
; `eq?', or if they are both lists such that `(car a)' is `equal?'
; to `(car b)' and `(cdr a)' is `equal?' to `(cdr b)'. Using this
; idea, implement `equal?' as a procedure.(5)
;
; {{{3 Solution
; {{{2 Exercise 2.55:
; {{{3 Problem
; Eva Lu Ator types to the interpreter the
; expression
;
; (car ''abracadabra)
;
; To her surprise, the interpreter prints back `quote'. Explain.
;
; {{{3 Solution
;
; {{{1 2.3.2 Example: Symbolic Differentiation
;
; {{{2 Exercise 2.56:
; {{{3 Problem
; Show how to extend the basic differentiator to
; handle more kinds of expressions. For instance, implement the
; differentiation rule
;
; n_1 n_2
; --- = --- if and only if n_1 d_2 = n_2 d_1
; d_1 d_2
;
; by adding a new clause to the `deriv' program and defining
; appropriate procedures `exponentiation?', `base', `exponent', and
; `make-exponentiation'. (You may use the symbol `**' to denote
; exponentiation.) Build in the rules that anything raised to the
; power 0 is 1 and anything raised to the power 1 is the thing
; itself.
;
; {{{3 Solution
; {{{2 Exercise 2.57:
; {{{3 Problem
; Extend the differentiation program to handle sums
; and products of arbitrary numbers of (two or more) terms. Then
; the last example above could be expressed as
;
; (deriv '(* x y (+ x 3)) 'x)
;
; Try to do this by changing only the representation for sums and
; products, without changing the `deriv' procedure at all. For
; example, the `addend' of a sum would be the first term, and the
; `augend' would be the sum of the rest of the terms.
;
; {{{3 Solution
; {{{2 Exercise 2.58:
; {{{3 Problem
; Suppose we want to modify the differentiation
; program so that it works with ordinary mathematical notation, in
; which `+' and `*' are infix rather than prefix operators. Since
; the differentiation program is defined in terms of abstract data,
; we can modify it to work with different representations of
; expressions solely by changing the predicates, selectors, and
; constructors that define the representation of the algebraic
; expressions on which the differentiator is to operate.
;
; a. Show how to do this in order to differentiate algebraic
; expressions presented in infix form, such as `(x + (3 * (x +
; (y + 2))))'. To simplify the task, assume that `+' and `*'
; always take two arguments and that expressions are fully
; parenthesized.
;
; b. The problem becomes substantially harder if we allow standard
; algebraic notation, such as `(x + 3 * (x + y + 2))', which
; drops unnecessary parentheses and assumes that multiplication
; is done before addition. Can you design appropriate
; predicates, selectors, and constructors for this notation
; such that our derivative program still works?
;
; {{{3 Solution
;
; {{{1 2.3.3 Example: Representing Sets
;
; {{{2 Exercise 2.59:
; {{{3 Problem
; Implement the `union-set' operation for the
; unordered-list representation of sets.
;
; {{{3 Solution
; {{{2 Exercise 2.60:
; {{{3 Problem
; We specified that a set would be represented as a
; list with no duplicates. Now suppose we allow duplicates. For
; instance, the set {1,2,3} could be represented as the list `(2 3 2
; 1 3 2 2)'. Design procedures `element-of-set?', `adjoin-set',
; `union-set', and `intersection-set' that operate on this
; representation. How does the efficiency of each compare with the
; corresponding procedure for the non-duplicate representation? Are
; there applications for which you would use this representation in
; preference to the non-duplicate one?
;
; {{{3 Solution
; {{{2 Exercise 2.61:
; {{{3 Problem
; Give an implementation of `adjoin-set' using the
; ordered representation. By analogy with `element-of-set?' show
; how to take advantage of the ordering to produce a procedure that
; requires on the average about half as many steps as with the
; unordered representation.
;
; {{{3 Solution
; {{{2 Exercise 2.62:
; {{{3 Problem
; Give a [theta](n) implementation of `union-set'
; for sets represented as ordered lists.
;
; {{{3 Solution
; {{{2 Exercise 2.63:
; {{{3 Problem
; Each of the following two procedures converts a
; binary tree to a list.
;
; (define (tree->list-1 tree)
; (if (null? tree)
; '()
; (append (tree->list-1 (left-branch tree))
; (cons (entry tree)
; (tree->list-1 (right-branch tree))))))
;
; (define (tree->list-2 tree)
; (define (copy-to-list tree result-list)
; (if (null? tree)
; result-list
; (copy-to-list (left-branch tree)
; (cons (entry tree)
; (copy-to-list (right-branch tree)
; result-list)))))
; (copy-to-list tree '()))
;
; a. Do the two procedures produce the same result for every tree?
; If not, how do the results differ? What lists do the two
; procedures produce for the trees in *Note Figure 2-16::?
;
; b. Do the two procedures have the same order of growth in the
; number of steps required to convert a balanced tree with n
; elements to a list? If not, which one grows more slowly?
;
; {{{3 Solution
; {{{2 Exercise 2.64:
; {{{3 Problem
; The following procedure `list->tree' converts an
; ordered list to a balanced binary tree. The helper procedure
; `partial-tree' takes as arguments an integer n and list of at
; least n elements and constructs a balanced tree containing the
; first n elements of the list. The result returned by
; `partial-tree' is a pair (formed with `cons') whose `car' is the
; constructed tree and whose `cdr' is the list of elements not
; included in the tree.
;
; (define (list->tree elements)
; (car (partial-tree elements (length elements))))
;
; (define (partial-tree elts n)
; (if (= n 0)
; (cons '() elts)
; (let ((left-size (quotient (- n 1) 2)))
; (let ((left-result (partial-tree elts left-size)))
; (let ((left-tree (car left-result))
; (non-left-elts (cdr left-result))
; (right-size (- n (+ left-size 1))))
; (let ((this-entry (car non-left-elts))
; (right-result (partial-tree (cdr non-left-elts)
; right-size)))
; (let ((right-tree (car right-result))
; (remaining-elts (cdr right-result)))
; (cons (make-tree this-entry left-tree right-tree)
; remaining-elts))))))))
;
; a. Write a short paragraph explaining as clearly as you can how
; `partial-tree' works. Draw the tree produced by `list->tree'
; for the list `(1 3 5 7 9 11)'.
;
; b. What is the order of growth in the number of steps required by
; `list->tree' to convert a list of n elements?
;
; {{{3 Solution
; {{{2 Exercise 2.65:
; {{{3 Problem
; Use the results of *Note Exercise 2-63:: and
; *Note Exercise 2-64:: to give [theta](n) implementations of
; `union-set' and `intersection-set' for sets implemented as
; (balanced) binary trees.(5)
;
; {{{3 Solution
; {{{2 Exercise 2.66:
; {{{3 Problem
; Implement the `lookup' procedure for the case
; where the set of records is structured as a binary tree, ordered
; by the numerical values of the keys.
;
;
; {{{3 Solution
;
; {{{1 2.3.4 Example: Huffman Encoding Trees
;
; {{{2 Exercise 2.67:
; {{{3 Problem
; Define an encoding tree and a sample message:
;
; (define sample-tree
; (make-code-tree (make-leaf 'A 4)
; (make-code-tree
; (make-leaf 'B 2)
; (make-code-tree (make-leaf 'D 1)
; (make-leaf 'C 1)))))
;