본문 바로가기

코드이야기/R

[R프로그래밍] 순환문을 이용해 콜라츠 추측 자동화하기


지난 포스팅에서 종이와 연필로 생각을 그려보는 것이 프로그래밍에 도움이 된다는 말과 함께 조건문과 함수를 활용해 콜라츠 추측을 계산했습니다. 오늘은 순환문을 사용해서 이 콜라츠 추측을 자동으로 계산하고 몇 번만에 임의의 정수가 1이 되었는지 출력하는 프로그램을 작성해 보겠습니다.


읽기 전에 추천 한 번!

블로거에겐 큰 힘입니다


순환문은 크게 2가지로 나눕니다. for문과 while문 입니다. for문은 반복하려는 횟수를 미리 알고있는 경우에 사용합니다. 반면, while문은 반복하려는 횟수는 알수 없지만 특정 조건을 만족하는 동안 어떤 명령을 반복해서 처리할 필요가 있을 때 사용합니다.


R프로그래밍에서 for문과 while문의 기본문법은 아래와 같습니다.


[for 문]

for (반복할 변수 in 반복범위) {

반복할 명령문

}


[while 문]

while (조건) {

반복할 명령문

}


콜라츠 추측은 어떤 임의의 자연수가 1이 될 때까지 조건을 반복해야 합니다. while문을 사용해서 처리하겠습니다. 지난 포스팅에서 작성한 함수를 약간 변형했습니다.

Collatz <- function(n) {        # 함수정의
  counter <- 0                  # 반복횟수 계산을 위한 Counter 정의
  while(n != 1){                # n이 1이 아닌 경우 계속 반복 
      if (n %% 2 == 0) {        # n이 짝수일 경우 처리 정의
      n <- n/2 
      print(n)                               
      counter <- counter + 1   
      } else {                  # n이 홀수일 경우 처리 정의
      n <- 3*n + 1
      print(n)      
      counter <- counter + 1
    }
  }
  print(counter)                # while문을 빠져나올 때 counter 출력
}
실행결과 입니다.
> Collatz(10)
[1] 5
[1] 16
[1] 8
[1] 4
[1] 2
[1] 1
[1] 6     # Counter, 6번만에 1로 돌아옴

2~3번 정도 반복하는 경우야 그냥 수작업으로 하면 되겠지만, 나중에 다룰 시뮬레이션과 같이 반복횟수가 늘어나는 경우 반복문은 필수입니다. for문 역시 while문과 사용법은 크게 다르지 않습니다.