티스토리 뷰
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(1, 10):#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
k = 2
while k <= firstN and k <= firstN :
if firstN % k == 0 and secondN % k == 0 :
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() * 2 - 1
y = random.random() * 2 - 1
if x*x + y*y <= 1 : #점이 떨어지는 위치가 원 안인 경우 numberOfHits에 +1
numberOfHits += 1
pi = 4*numberOfHits / NUMBER_OF_TRIALS
print("PI is ", pi) |
cs |
참고 문헌 : Introduction to Programming Using Python / Y.DANIEL LIANG
※
본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.
교재 영어 원서를 직접 번역하여 정리한 게시물이므로 일부 오타, 의역이 존재할 수 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다.
※
'파이썬 > 이론' 카테고리의 다른 글
[파이썬]함수, 함수 정의, 함수 호출 (1) | 2017.07.23 |
---|---|
[파이썬]break, continue, 소수 출력(Prime Number), 랜덤워크(Random Walk) (0) | 2017.07.21 |
[파이썬]루프(while문 for문) (0) | 2017.07.21 |
[파이썬]조건식,연산자 우선순위와 결합법칙, 객체의 위치파악 (0) | 2017.07.18 |
[파이썬]논리 연산자(or, and, not), 윤년 계산, 복권 프로그램 (0) | 2017.07.18 |
- Total
- Today
- Yesterday
- 백준 11501
- 파이썬 while
- 백준 1874
- 파이썬 선택문
- 파이썬 for
- css 그리드
- 파이썬 연산자
- 파이썬
- 백준
- 자바스크립트 자료구조
- 파이썬 단계적 개선
- 파이썬 터틀
- 자바
- css 박스
- 파이썬 리스트
- 자바스크립트 그래프
- 자바 에센셜 실습문제
- 명품 c++ 실습
- 버츄어박스
- 자료구조
- 웹
- 파이썬 함수
- 백준 10451
- 파이썬 객체
- 파이썬 진수 변환
- 파이썬 if문
- css
- 파이썬 예제
- 파이썬 클래스
- 파이썬 문자열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |