목차

옮긴이의 글

 

서문

왜 모든 사람이 프로그래밍을 배워야 하는가

디자인 레시피

Scheme과 DrRacket의 선택

이 책의 구성

감사의 글

 

1부. 간단한 형태의 데이터 처리1

1장 학습자, 교육자, 컴퓨터3

2장 수, 표현, 간단한 프로그램7

2.1 수와 연산7

2.2 변수와 프로그램10

2.3 응용 문제15

2.4 오류17

2.5 프로그램 디자인21

3장 프로그램은 함수+변수 졍의다27

3.1 함수 조합28

3.2 변수 정의32

3.3 함수 구성에 관한 연습문제34

4장 조건문과 함수37

4.1 불린과 관계37

4.2 조건을 검사하는 함수41

4.3 조건과 조건문46

5장 기호 정보57

5.1 기호에 관한 몸풀기 문제60

6장 복합 데이터 1: 구조체63

6.1 구조체63

6.2 추가 연습문제: 간단한 그림 그리기67

6.3 구조체 정의71

6.4 데이터 정의76

6.5 복합 데이터를 다루는 함수 디자인79

6.6 추가 연습문제: 원과 사각형 움직이기85

6.7 추가 연습문제: 행맨 단어 맞히기91

7장 데이터의 다양성 95

7.1 데이터를 혼합하고 구분하기96

7.2 혼합 데이터를 다루는 함수 디자인101

7.3 함수 조합 다시 보기106

7.4 추가 연습문제; 도형 움직이기109

7.5 입력 오류110

8장 쉬어가기 1: 구문과 의미113

8.1 Scheme의 어휘114

8.2 Scheme의 문법115

8.3 Scheme의 의미118

8.4 오류122

8.5 불린 표현125

8.6 변수 정의

8.7 구조체 정의

 

2부. 임의의 큰 자료 처리133

9장 복합 데이터 2: 리스트135

9.1 리스트135

9.2 임의 길이의 리스트에 대한 데이터 정의141

9.3 임의 길이의 리스트 다루기144

9.4 자기 참조 데이터 정의에 대한 함수 디자인148

9.5 간단한 리스트를 다루는 다양한 예151

10장 리스트 처리 더 보기159

10.1 리스트를 출력하는 함수159

10.2 구조체를 포함하는 리스트165

10.3 추가 연습문제: 그림 옮기기174

11장 자연수177

11.1 자연수의 정의177

11.2 임의 길이의 자연수 다루기179

11.3 추가 연습문제: 리스트 작성 및 함수 테스트183

11.4 자연수에 대한 또 다른 데이터 정의186

11.5 자연수의 성질에 관한 보다 자세한 논의193

12장 함수 조합 다시 보기197

12.1 복잡한 프로그램 디자인하기197

12.2 재귀 보조 함수199

12.3 문제 일반화, 함수 일반화205

12.4 추가 연습문제: 단어 재배열하기210

13장 쉬어가기 2: 리스트 축약215

 

3부. 임의의 큰 데이터 처리 더 보기221

14장 자기 참조 데이터 정의 더 보기223

14.1 구조체의 구조223

14.2 추가 연습문제: 이진 검색 트리234

14.3 리스트 내의 리스트240

14.4 추가 연습문제: Scheme 계산245

15장 상호 참조 데이터 정의249

15.1 구조체 리스트, 구조체 내의 리스트249

15.2 상호 참조 정의를 다루는 함수 디자인하기257

15.3 추가 연습문제: 웹페이지 더 보기

16장 반복적 개선을 통한 개발263

16.1 데이터 분석264

16.2 데이터 집합 정의하기 및 개선하기266

16.3 함수 및 프로그램 개선하기270

17장 두 복합 데이터 다루기273

17.1 두 리스트 동시에 다루기: 경우 1273

17.2 두 리스트 동시에 다루기: 경우 2276

17.3 두 리스트 동시에 다루기: 경우 3280

17.4 함수 단순화285

17.5 복잡한 두 개의 데이터를 입력받는 함수 디자인287

17.6 복잡한 두 입력을 다루는 예289

17.7 추가 연습문제: Scheme 계산하기, 두 번째294

17.8 통일성과 테스트296

18장 쉬어가기 3: 지역정의와 유효 영역307

18.1 local을 이용한 함수 조직307

18.2 유효 영역과 블록 구조325

 

4부. 디자인 추상화331

19장 정의 사이의 유사성333

19.1 함수 사이의 유사성334

19.2 데이터 정의 사이의 유사성345

20장 함수는 값이다353

20.1 구문과 의미353

20.2 추상 함수 및 다형적 함수에 대한 계약356

21장 예에서 추상화 디자인하기363

21.1 예에서 추상화 끌어내기363

21.2 추상화 리스트 함수를 다루는 몸풀기 문제371

21.3 추상화와 유일한 관리 지점374

21.4 추가 연습문제: 움직이는 그림 다시 보기376

21.5 참고: 템플릿으로부터 추상화 디자인하기378

22장 함수를 출력하는 함수를 이용한 추상화 디자인381

22.1 함수를 출력하는 함수381

22.2 값으로서의 함수를 이용한 추상 함수 디자인383

22.3 GUI 맛보기387

23장 수학 예제399

23.1 수열과 급수399

23.2 등차수열과 급수402

23.3 등비수열과 급수404

23.4 함수 내 면적408

23.5 함수의 기울기411

24장 쉬어가기 4: 즉석에서 함수 정의하기419

24.1 람다 표현의 구문420

24.2 람다의 영역과 의미420

24.3 람다의 활용425

 

5부. 발생적 재귀427

25장 새로운 형태의 재귀 호출249

25.1 테이블 위의 공 모델링하기431

25.2 빠르게 정렬하기435

26장 알고리즘 디자인하기443

26.1 종료446

26.2 구조적 재귀 대 발생적 재귀450

26.3 선택하기451

27장 주제에 의한 변주곡459

27.1 프랙탈460

27.2 파일에서 선으로, 리스트에서 리스트를 갖는 리스트로466

27.3 이진 검색471

27.4 뉴턴 방법479

27.5 추가 연습문제: 가우스 소거법482

28장 역추적하는 알고리즘489

28.1 그래프 순회489

28.2 추가 연습문제: 퀸 체크497

29장 쉬어가기 5: 컴퓨팅 연산 비용과 벡터501

29.1 구체적 시간, 추상 시간502

29.2 ‘차수’의 정의508

29.3 벡터 맛보기511

 

6부. 지식 축적527

30장 지식의 손실529

30.1 구조적 처리의 문제점529

30.2 발생적 재귀의 문제점534

31장 축적기 방식의 함수 디자인하기541

31.1 축적기의 필요성 인식하기542

31.2 축적 방식의 함수543

31.3 함수를 축적 방식으로 바꾸기545

32장 축적의 다른 용도559

32.1 추가 연습문제: 트리에서의 축적기559

32.2 추가 연습문제: 선교사와 식인종566

32.3 추가 연습문제: 보드 솔리테어570

33장 쉬어가기 6: 근사값의 본질573

33.1 고정 길이 수 연산573

33.2 오버플로580

33.3 언더플로581

33.4 DrRacket의 수582

 

7부. 변수의 상태 바꾸기585

34장 함수의 메모리587

35장 변수의 할당593

35.1 작업에서의 간단한 할당594

35.2 순차적 표현 연산596

35.3 할당과 함수599

36.4 유용한 첫 예제601

36장 메모리를 갖는 함수 디자인하기607

36.1 메모리의 필요성608

36.2 메모리와 상태 변수610

36.3 메모리르 초기화하는 함수612

36.4 메모리를 바꾸는 함수613

37장 메모리 사용 예623

37.1 상태 초기화623

37.2 사용자의 행동으로 인한 상태 변화627

37.3 재귀 호출로부터의 상태 변화639

37.4 상태 변화에 관한 몸풀기 문제647

37.5 추가 연습문제: 장소 탐험650

38장 쉬어가기 7: 최종 구문과 의미653

38.1 상급자용 Scheme의 어휘653

38.2 상급자용 Scheme의 문법654

38.3 상급자용 Scheme의 의미657

38.4 사급자용 Scheme에서의 오류672

 

8부. 복합 값 바꾸기677

39장 캡슐화679

39.1 상태 변수가 있는 추상화679

39.2 캡슐화 연습하기691

40장 변경 가능한 구조체695

40.1 함수로부터의 구조체695

40.2 변경 가능한 함수 구조체699

40.3 변경 가능한 구조체702

40.4 변경 가능한 벡터710

40.5 변수 바꾸기, 구조체 바꾸기712

41장 구조체를 변경하는 함수 디자인하기717

41.1 왜 구조체를 변경하는가717

41.2 구조적 디자인 레시피와 변경 1718

41.3 구조적 디자인 레시피와 변경 2734

41.4 추가 연습문제: 그림 움직이기 3749

42장 동일성751

42.1 외면적 동일성751

42.2 내포적 동일성753

43장 구조체, 벡터, 객체 바꾸기759

43.1 벡터 더 연습하기759

43.2 순환되는 구조체 집합779

43.3 상태 역추적793

 

에필로그

컴퓨팅

프로그래밍

더 나아가기

 

찾아보기

그림 차례

1 프로그램 디자인 레시피의 기본 단계iv

2 각 부와 쉬어가기 간의 의존 관계xiv

3 디자인 레시피: 완전한 예시23

4 정리된 디자인 레시피265 profit 프로그램을 표현하는 두 가지 방법31

6 조건 함수의 구현을 디자인하기53

7 DrRachet에서 이미지로 표현된 행성58

8 신호등 그리기70

9 increment-sales의 완전한 정의73

10 데이터 정의의 의미78

11 복합 데이터의 디자인 레시피81

12 복합 데이터에 대한 정리된 디자인 레시피84

13 움직이는 얼굴86

14 원, 사각형 그리고 점89

15 행맨 그림의 세 단계92

16 간단한 좌표 에제97

17 혼합 데이터에 대한 디자인 레시피: 완전한 예시104

18 혼합 데이터에 대한 정리된 디자인 레시피105

19 둘레를 정의하는 두 가지 방법107

20 초급자용 Scheme: 핵심 어휘114

21 초급자용 Scheme: 핵심 문법115

22 문법적 이름 규약118

23 변수 정의의 예128

24 초급자용 Scheme: 완전한 문법132

25 리스트 만들기136

26 자기 참조 데이터에 대한 정리된 디자인 레시피151

27 주급 계산161

28 재고 가치 계산168

29 장난감 리스트170

30 재고 리스트에서 값 항목을 추출172

31 팩토리얼, product-from-20. product의 계산190

32 자연수에 pi 더하기195

33 수 리스트 정렬하기205

34 다각형 그리기209

35 가계도의 예224

36 가계도 예를 Scheme으로 나타낸 결과228

37 눈이 파란 조상을 찾는 두 함수231

38 이진 검색 트리와 이진 트리236

39 웹페이지에 관한 size 함수 정의243

40 후손 가계도250

41 후손 가계도의 Scheme 표현252

42 파란 눈의 후손을 찾는 두 프로그램256

43 여러 데이터 정의에 대해 함수들 정의하기259

44 디렉터리 트리의 예265

45 완성된 replace-eol-with 정의274

46 완성된 hours->wage의 정의278

47 list-pick에 관한 데이터 정의280

48 완성된 list-pick 정의283

49 list-pick의 간단한 버전286

50 테스트 함수304

51 Scheme 정의309

52 유사한 두 함수334

53 유사한 또 다른 두 함수336

54 filter1의 두 가지 변경342

55 유사한 함수에서의 차이 표시346

56 중급자용 Scheme: 문법354

57 Scheme에서 제공하는 리스트 처리 추상 함수372

58 달 착륙선 아폴로 11호(NASA: 미국 항공 우주국)377

59 local을 이용한 추상화384

60 전화번호를 검색하는 간단한 GUI388

61 모델-뷰 배치389

62 gui.ss의 연산들391

63 숫자를 수로 출력하는 GUI395

64 a와 b 구간에 대해 함수 f를 적분하기409

65 어떤 함수의 그래프413

66 move-until-out의 보조 함수432

67 퀵 정렬의 테이블 예시436

68 퀵 정렬 알고리즘438

69 알고리즘 디자인하기448

70 구조적 재귀를 이용해 최대공약수 찾기453

71 시어핀스키 삼각형460

72 시어핀스키 알고리즘462

73 파일을 여러 줄로 변환하기468

74 구간 [a,b]에서 함수 f의 근(1단계)472

75 해를 찾는 find-root 알고리즘476

76 방향 그래프490

77 그래프 내의 경로 찾기494

78 순환 경로가 존재하는 방향 그래프497

79 하나의 퀸이 있는 체스판498

80 두 표현의 실행시간 비교509

81 벡터 내에 있는 수의 합 계산(첫 번째 버전)519

82 벡터 내에 있는 수의 합 계산(첫 번째 버전)519

83 상대 거리를 절대 거리로 변환하기530

84 축적을 이용해 상대 거리를 변환하기534

85 간단한 그래프535

86 간단한 그래프에서 경로 찾기(첫 번째 버전)536

87 간단한 그래프에서 경로 찾기(두 번째 버전)538

88 축적 방식의 간단한 함수548

89 간단히 나타낸 몇 가지 이진 트리552

90 축적 방식의 height554

91 all-blue-eyed-ancestors?를 이용해서 가계도 조사하기560

92 축적 방식으로 눈이 파란 조상 모으기 (첫 번째 버전)562

93 축적 방식으로 눈이 파란 조상 모으기 (두 번째 버전)563

94 근사값 표현에 관한 함수576

95 주소록 GUI588

96 신호등의 세 가지 상태와 이를 나타낸 GUI590

97 행맨 게임의 GUI 및 세 가지 상태591

98 기초적인 주소록 프로그램603

99 메모리를 갖는 프로그램에 관한 조직 구성도609

100 상태 변수에 대한 디자인 레시피: 첫 번째 예619

101 상태 변수에 대한 디자인 레시피: 두 번째 예6204

102 색깔 맞히기624

103 색깔 맞히기(두 번째 부분)626

104 행맨 게임의 기초628

105 행맨 게임의 기초(두 번째 부분)630

106 행맨 게임의 기초(세 번째 부분)637

107 reveal-list 함수642

108 신호등 색깔을 바꾸는 두 가지 방법645

109 캠퍼스 여행하기651

110 여행하기651

111 상급자용 Scheme: 핵심 문법654

112 상급자용 Scheme: 값667

113 여러 신호등을 관리하는 프로그램681

114 재설정 서비스가 추가된 여러 신호등을 관리하는 프로그램686

115 여러 주소록을 관리하는 프로그램690

116 posn 함수의 기원696

117 변경자를 이용한 posn 구현699

118 엘리베이터에서 누른 버튼들을 초기화729

119 모음 숫자 세기733

120 모음을 세는 또 다른 방법734

121 카드 게임735

122 패 만들기736

123 마지막 카드 제거하기743

124 카드 패의 캡슐화 및 구조체 변경747

125 두 구조체의 내포적 동일성 여부 검사755

126 제자리 정렬 함수: 첫 번째 부분761

127 제자리 정렬 함수: 두 번째 부분764

128 정렬된 벡터에 항목 삽입하기766

129 제자리 퀵 정렬에서의 분할 단계768

130 제자리 퀵 정렬에서의 분할 과정770

131 벡터를 두 부분으로 재배열하기775

132 자식 추가하기782

133 변경을 통한 단순 그래프 만들기788