작성자: admin 작성일시: 2016-09-17 17:21:30 조회수: 129 다운로드: 20
카테고리: R 태그목록:

R의 for 반복문 기초 2

중첩 for 반복문

어떤 경우에는 반복문 안에서 다시 반복문을 실행해야 하는 경우가 있을 수 있다. 예를 들어 다음과 같이 인쇄해야 하는 경우를 생각해 보자.

0 1 2 3 
1 2 3 4 
2 3 4 5 
3 4 5 6

여러가지 방법이 있을 수 있지만 다음과 같이 for 반복문 안에 다시 for 반복문을 사용하는 중첩 반복문(nested loop)를 사용할 수도 있다.

In [4]:
for (i in 1:4) {
    for (j in 1:4) {
        cat(i + j - 2, "")
    } 
    cat("\n")
}
0 1 2 3 
1 2 3 4 
2 3 4 5 
3 4 5 6 

중첩 반복문을 사용할 때는 각각의 반복문에서 쓰고 있는 카운터 변수의 이름이 겹치지 않도록 주의해야 한다. 앞의 예에서는 바깥쪽 반복문의 카운터 변수는 i를 사용하였고 안쪽 반복문의 카운터 변수는 j를 사용하여 카운터 변수의 이름이 겹치지 않도록 하였다.

경우의 수를 구하는 데도 중첩 반복문을 사용할 수 있다. 예를 들어 1부터 6까지의 눈금이 있는 주사위를 두 번 던져서 나온 숫자들은 다음과 같이 구한다.

In [6]:
for (i in 1:6) {
    for (j in 1:6) {
        cat(i, j, "\n")
    }
}
1 1 
1 2 
1 3 
1 4 
1 5 
1 6 
2 1 
2 2 
2 3 
2 4 
2 5 
2 6 
3 1 
3 2 
3 3 
3 4 
3 5 
3 6 
4 1 
4 2 
4 3 
4 4 
4 5 
4 6 
5 1 
5 2 
5 3 
5 4 
5 5 
5 6 
6 1 
6 2 
6 3 
6 4 
6 5 
6 6 

만약 주사위를 두 번 던져서 나온 숫자들의 합이 4의 배수가 되는 경우만 구해야 한다면 다음과 같이 if 조건문을 추가한다.

In [8]:
for (i in 1:6) {
    for (j in 1:6) {
        n = i + j
        if (n %% 4 == 0) {
            cat(i, j, "\n")
        }
    }
}
1 3 
2 2 
2 6 
3 1 
3 5 
4 4 
5 3 
6 2 
6 6 

연습 문제 1

어떤 주식의 가격은 매일 한 번 동전을 던져서 앞면이 나오면 전날 가격의 2배가 되고 뒷면이 나오면 전날 가격의 절반이 된다.

1일에 주식의 가격이 1024원이었을 경우에 4일의 주식의 가격이 나올 수 있는 경우를 모두 구한다.

(힌트: for 반복문이 3개 중첩되어야 한다.)

연습 문제 2

프랑스의 수학자 페르마(Ferma)의 마지막 정리는 다음과 같다.

n이 2보다 큰 자연수인 경우에, $a^n + b^n = c^n$ 이 되는 자연수 $a$, $b$, $c$는 존재하지 않는다.

n이 3이고 a, b, c 가 1부터 10까지의 자연수일 때 페르마의 마지막 정리가 사실임을 중첩 반복문을 써서 보인다.

(힌트: 1부터 10까지 반복되는 for 반복문이 3개 중첩되어야 한다.)

카운터 변수가 변하는 경우

가장 복잡한 경우는 안쪽의 반복문의 반복 횟수가 바깥쪽 반복문의 카운터 변수에 따라 변하는 경우이다.

예를 들어 1부터 5까지의 합은 다음과 같이 하나의 반복문으로 구할 수 있지만,

In [9]:
n <- 5

sum <- 0
for (i in 1:n) {
    sum <- sum + i
}
cat(sum)
15

1부터 1까지의 합, 1부터 2까지의 합, 1부터 3까지의 합, 이런 식으로 1부터 10까지의 합을 각각 다 구해야 한다면 다음과 같이 반복문을 중첩해야 한다.

In [12]:
for (j in 1:10) {
    sum <- 0
    for (i in 1:j) {
        sum <- sum + i
    }
    cat(sum, "\n")
}
1 
3 
6 
10 
15 
21 
28 
36 
45 
55 

연습 문제 3

다음과 같은 수열이 있을 경우에 $n$번째 수열의 값을 구한다.

$$ 1 $$$$ 1 + (1 + 2) $$$$ 1 + (1 + 2) + (1 + 2 + 3) $$$$ 1 + (1 + 2) + (1 + 2 + 3) + (1 + 2 + 3 + 4) $$$$ \vdots $$$$ 1 + (1 + 2) + (1 + 2 + 3) + (1 + 2 + 3 + 4) + \cdots + (1 + \cdots + n) $$

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!