Skip to content

Commit e4d1dce

Browse files
committed
Add implementation of exercise 3-72
1 parent e71bf7a commit e4d1dce

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

README.org

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
习题完成情况:
2626
- 章节一: 43/46
2727
- 章节二: 88/97
28-
- 章节三: 65/82
28+
- 章节三: 66/82
2929
- 章节四: TODO
3030
- 章节五: TODO
3131
* 运行

chapter3/exercise3-72.rkt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#lang racket
2+
(require "stream.rkt")
3+
(require "infinite-stream.rkt")
4+
(require "exercise3-70.rkt")
5+
6+
(define square-weight (lambda (pair) (let ((i (car pair))
7+
(j (cadr pair)))
8+
(+ (* i i)
9+
(* j j)))))
10+
(define square-pairs (pairs-weighted integers integers square-weight))
11+
12+
(define (find-square-sum-of-3ways s)
13+
(if (or (stream-null? s)
14+
(stream-null? (stream-cdr s))
15+
(stream-null? (stream-cdr (stream-cdr s))))
16+
(error "The given stream contains less than 3 elements")
17+
(let* ((first (stream-car s))
18+
(second (stream-car (stream-cdr s)))
19+
(third (stream-car (stream-cdr (stream-cdr s))))
20+
(first-w (square-weight first))
21+
(second-w (square-weight second))
22+
(third-w (square-weight third)))
23+
(if (and (= first-w second-w) (= second-w third-w))
24+
;; 找到两个平方数之和的三种表达方式
25+
(cons-stream
26+
(list first-w first second third)
27+
;; 将找到的有相同权重的三个序对排除
28+
(find-square-sum-of-3ways
29+
(stream-cdr (stream-cdr (stream-cdr s)))))
30+
;; 没找到,递归寻找
31+
(find-square-sum-of-3ways (stream-cdr s) )))))
32+
33+
(define 3ways-square-sum-stream (find-square-sum-of-3ways square-pairs))
34+
35+
(module+ test
36+
(require rackunit)
37+
(test-case "Test for square sum of 3ways"
38+
(check-equal? (stream-take-n 3ways-square-sum-stream 3) '((325 (1 18) (6 17) (10 15))
39+
(425 (5 20) (8 19) (13 16))
40+
(650 (5 25) (11 23) (17 19))))
41+
)
42+
)

0 commit comments

Comments
 (0)