리스트 연산
•‘cdr연산을 가지고 흝어 내려가는’ 프
로그램 기법으로 리스트 연산을 만
듬.
• List-ref 프로시져 - 리스트와 수 N
을 인자로 받아서, 그 리스트의 n번
째 원소를 내놓음.
• List-ref 규칙
– N = 0이면, list-ref의 값은 리스트의
car 이다.
– 그렇지 않으면, list-ref는 리스트의
cdr에서 n-1번째 원소다.
(define (list-ref items n)
(if (= n 0)
(car items)
(list-ref (cdr items) (- n 1))))
(define squares (list 1 4 9 16 25))
(list-ref squares 3)
16
5.
리스트 연산
•length 프로시져 - 리스트를 인자로
받아 리스트의 원소가 몇 개인지 찾
음.
• length 규칙
– 리스트의 length는 그 리스트의 cdr
의 length에 1을 더한 값이다.
– 빈 리스트의 length는 0이다.
• Null? – 인자가 빈인자인지 판단.
(define (length items)
(if (null? items)
0
(+ 1 (length (cdr items)))))
(define odds (list 1 3 5 7))
(length odds)
4
-----------------------------------------------
(define (length items)
(define (length-iter a count)
(if (null? a)
count
(length-iter (cdr a) (+ 1 count))))
(length-iter items 0))
(define odds (list 1 3 5 7))
(length odds)
6.
리스트 연산
•‘리스트 구조를 cdr로 풀어 헤치면서,
이를 cons로 되묶어서 새로운 리스트
를 만드는 방법’
• Append 프로시져 – 두 리스트를 인자
로 받아 모든 원소를 한데 엮어 새 리
스트를 만듬.
• Append 규칙
– List1이 빈 리스트면, 결과는 list2임.
– 그렇지 않으면, list1의 cdr와 list2를
append한 다음 , 그 결과에 list1의
car를 cons 한 리스트를 만듬.
(define squares (list 1 2 3 4))
(define odds (list 6 7 8 9))
(define (append list1 list2)
(if (null? list1)
list2
(cons (car list1)
(append (cdr list1) list2))))
(append squares odds)
- 1 2 3 4 6 7 8 9
2.2.2 계층 구조
• 차례열을 원소로하는 차례열을
나타낼수 있음.
(cons (list 1 2) (list 3 4))
• 차례열을 원소로 가지는 차례
열을 나무(Tree) 꼴로 펼쳐 나
타낼수있음.
9.
Count-leaves 프로시져
•Count-leaves 프로시져 - 재귀 처리
로 나무 가지를 순회하여 나뭇잎의
카운터를 계산.
• Count-leaves 규칙
– 리스트 x의 length는 x의 cdr의
length에 1을 더한 값이다.
– 빈 리스트의 length는 0이다.
• Pair 프로시져 – 인자로 받은 값이 쌍인지
판단.
#lang scheme ;added
(define x (cons (list 1 2) (list 3 4)))
(length (list x x))
- 2
(count-leaves x)
- 4
;---------------------------------------------
(define (count-leaves x)
(cond ((null? x) 0)
((not (pair? x)) 1)
(else (+ (count-leaves (car x))
(count-leaves (cdr x))))))
10.
나무 매핑
•Map과 재귀 처리 방식을 한데 엮
어 나무꼴 데이터를 효과적으로
다룰 수 있음.
• scale-tree 프로시져 – 곱할 수와
나무를 인자로 받아, 모든 나뭇잎
에 곱수가 곱해진 나무를 반환.
• 다른 방법은 나무를 부분 나무의
차례열로 보고, map을 사용.
(define (scale-tree tree factor)
(cond ((null? tree) null)
((not (pair? tree)) (* tree factor))
(else (cons (scale-tree (car tree) factor)
(scale-tree (cdr tree) factor)))))
(scale-tree (list 1 (list 2 (list 3 4) 5) (list 6 7)) 10)
-------------------------------------------------------
(define tempTree (list 1 (list 2 (list 3 4) 5) (list 6 7)))
(define (scale-tree tree factor)
(map (lambda (sub-tree1)
(if (pair? sub-tree1)
(scale-tree sub-tree1 factor)
(* sub-tree1 factor)))
tree))
(scale-tree tempTree 10)
;(10 (20 (30 40) 50) (60 70))
11.
2.2.3 공통 인터페이스로써차례열의 쓰임새
• 나무꼴 데이터를 인자로
받아서 잎사귀 가운데 홀수인
것만 제곱한 다음에 이것을 모두
더한 값을 반환
------------------------------------
• N보다 작거나 N과 같은
정수 K에 대하여 피보나치 수열
Fib(k) 값을 구한 후 짝수만
모아서 리스트로 묶어내는
프로시져
(define (square x) (* x x))
(define (sum-odd-squares tree)
(cond ((null? tree) 0)
((not (pair? tree))
(if (odd? tree) (square tree) 0))
(else (+ (sum-odd-squares (car tree))
(sum-odd-squares (cdr tree))))))
----------------------------------------------------
(define (even-fibs n)
(define (next k)
(if (> k n)
null
(let ((f (fib (k))))
(if (even? f)
(cons f (next (+ k 1)))
(next (+ k 1))))))
(next 0))
12.
• 처리 과정이비슷함.
• 그러나 두 프로시져는 신호가 흘러가는 구조를 갖추지 못하였음.
• 따라서 두 프로시저 정의에서는 신호 흐름 방식의 단계별 처리 과정
이 확실히 대응하는 부분을 찾기 힘듬.
13.
차례열 연산
•계산 단계에서 다음 계산 단계로 흘러가는
신호를 리스트로 나타내면, 모든 단계별
처리 과정을 리스트 연산이 가능함.
• 모듈 방식으로 독립된 부품을 짜 맞추듯이
프로그램을 설계
겹친 매핑
•차례열 패러다임의 쓰임새를 넓혀서, 겹친 루프를 써서 나타낼 수
있는 계산 문제를 표현
• 양의 정수 n, I, j가 있을때, 1 <= j < I <= n 만족하고 I + j 의 값이
소수가 되는 i와 j의 모든 순서 쌍을 구하는 문제
• N = 6 일 경우.
20.
• Enumerate
–n보다 작거나 같은 양의
정수로 이루어진 모든 순서
쌍을 차례열로 묶어냄
• Filter
– 그 가운데 그 합이 소수인
쌍들만 거르개로 고름.
• Map
– 골라낸 쌍(I,j)에 대해 트리
플(I,j, i+j)를 만듬.
• Accumulate
(accumulate append
nil
(map (lambda (i)
(map (lambda ( j) (list i j))
(enumerate-interval 1 (- i 1))))
(enumerate-interval 1 n)))
(define (flatmap proc seq)
(accumulate append nil (map proc seq)))
----------------------------------------------------------
(define (prime-sum? pair)
(prime? (+ (car pair) (cadr pair))))
----------------------------------------------------------
(define (make-pair-sum pair)
(list (car pair) (cadr pair)
(+ (car pair) (cadr pair))))