티스토리 뷰

5.4 중첩 루프(Nested Loops)

 

- 루프 바디(body) 안에다른 루프문을 구현 할 수 있다.

- 중첩 루프(Nested Loops)는 외부 루프안에 또 다른 내부 루프가 구현되어 있는 것을 중첩 루프라고 부른다.

- 외부 루프(outer loops)가 실행 될 때 마다 외부 루프 바디 안에 있는 내부 루프(inner loops)문이 실행되고 반복한다.

 

* 중첩 루프 예시

1
2
3
4
5
6
7
8
9
10
11
12
print("       Multiplication Table")
print("   ",end = '')
for j in range(110):#outer 제일 위 열의 숫자 표현
    print("  ", j, end = '')
print()
print("----------------------------------------")
 
for i in range(1,10):# 맨 왼쪽 행의 숫자 표현
    print(i, "|", end = '')
    for j in range(1,10):# 각 행에 1~9까지 숫자 나열
        print(format(i*j, "4d"), end = '')
    print()
cs

 

- 중첩루프문을 너무 많이 사용하면 수행시간이 오래 걸릴 수 있다.

 

for i in range(1000):

for j in range(1000):

for k in range(1000): 

Perform an action

 

- 위 루프문 은 총 1,000,000,000 회 수행하게 되며 한번 수행하는데 1밀리 초가 걸린다고 가정하면,  277시간 이상 걸리게 됩니다.

 

5.5 수치 오차 최소화하기(Minimizing Numerical Errors)

- 소숫점 숫자(floating - point numbers)를 루프 조건식에 사용하게 되면 수치 오차를 발생 할 수 있다.

- 소숫점 숫자를 사용함에 있어 수치오차는 불가피 하다.

- 이번 섹션에서는 수치오차를 최소하 하는 예를 보여줄 예정이다.

 

*소숫점 덧셈 예제

sum = 0

i = 0.01
while i <= 1.0:
    sum += i
    i = i + 0.01

print("The sum is", sum)

 

- 위의 코드는 0.01 부터 ..0.99 + 1.0 까지 더하는 프로그램이다.

- 정답은 50.5가 나와야 하는데, 실제로 프로그램 결과는 49.5가 나오게 된다.

- 이유는 루프문이 끝날 때 변수 i에 할당된 값이 정확이 1이 아닌 미세하게나마 1보다 더 큰 값이 할당되게 된다.

- 근본적인 이유로, 소숫점 숫자를 이용할 때에는 정확한 수치가 아닌 근사치(approximation)로 표현이 되며 이 이유 때문에 마지막 변수 i에 할당된 값이 1.0보다 미세하게 나마 큰 수가 할당되며, 마지막 sum에 숫자를 넣지 못하는 문제를 야기시킨다..
- 이 문제를 해결하기 위해선 정수 count 변수를 이용하는 것이 좋다.

 

* count 변수를 이용한 소숫점 덧셈 예제

sum = 0

count = 0
i = 0.01
while count < 100:
    sum += i
    i = i + 0.01
    count += 1

print("The sum is", sum)

 

for 문 역시 횟수를 기반으로 하는 반복문이기 때문에 이용하면 좋다.

 

*for 문을 이용한 소숫점 덧셈 예제

sum = 0

i = 0.01

for count in range(0,100):
    sum += i
    i += 0.01

print(sum)


 

5.6.1 최대공약수 구하기

1
2
3
4
5
6
7
8
9
10
11
12
firstN = eval(input("Enter the first number: "))
secondN = eval(input("Enter the second number: "))
 
gcd = 1
= 2
 
while k <= firstN and k <= firstN :
    if firstN % k == and secondN % k == :
        gcd = k
    k += 1
 
print("The greatest common divisor for ", firstN, "and", secondN, "is ", gcd)
cs

 

5.6.3 몬테카를로 시뮬레이션(Monte Carlo Simulation)

몬테카를로 시뮬레이션은 랜덤의 숫자와 확률을 이용하여 문제를 해결하는 기법이다. 물리, 화학, 금융 분야에서 널리 사용되는 기법 중 하나이다. 이런 몬테카를로 시뮬레이션을 통해 원주율의 크기를 예측하는 프로그램을 만들어 보자.

 

 

- 반지름이 1인 원과, 그 원을 둘러싼 사각형이 있다.

- 이 사각형 안에 무작위로 1000000번의 점들을 찍는다.

- 이 점들이 원 안에 떨어질 확률을은 원의 넓이 / 사각형의 넓이, 즉 (Pi / 4) 이다.

- 즉, 점들이 원 안에 떨어지는 횟수는 1000000 * (원의 넓이(Pi) / 사각형의 넓이) 이다.

- 이를 방정식을 이용해 Pi를 구하는 공식을 구할 수 있다.

Pi = numberOfHits / 1000000

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import random
 
NUMBER_OF_TRIALS = 1000000
numberOfHits = 0
 
for i in range(NUMBER_OF_TRIALS): # 점이 떨어지는 위치
    x = random.random() * - 1
    y = random.random() * - 1
 
    if x*+ y*<= : #점이 떨어지는 위치가 원 안인 경우 numberOfHits에 +1
        numberOfHits += 1
 
pi = 4*numberOfHits / NUMBER_OF_TRIALS
 
print("PI is ", pi)
cs

 

 

참고 문헌 : Introduction to Programming Using Python / Y.DANIEL LIANG



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.


교재 영어 원서를 직접 번역하여 정리한 게시물이므로 일부 오타, 의역이 존재할 수 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다. 

댓글