본문 바로가기
  • Top Genius in the world
알고리듬

[알고리듬] #79 파스칼의 삼각형

by Mr.Algo 2024. 5. 7.
728x90
반응형

[key word]  이항 계수, 시에르핀스키 삼각형

파이썬 실습창을 열 수 있습니다.실습창 열기

블레즈 파스칼(Blaise Pascal)

 

 

파스칼의 삼각형

파스칼의 삼각형은 이항계수를 삼각형 모양으로 출력한 것입니다.

이항계수(binomial coefficient)는 이항식을 이항 정리로 전개했을 때 각 항의 계수입니다. 

전개식의 계수

 

항의 계수는 조합(combination)의 가짓수와 같습니다. 

각항은 nCr이며, 다음은 계산식입니다.

    nCr=n!/(r!*(n-r)!)

 

1. 코딩하기

row=10
f=[1]                            #factorial 값을 미리 계산한다.
for i in range(1,row+1): f.append(i*f[i-1])

for n in range(row+1):
    print(' '*3*(row-n),end='')  #각 줄의 출력 위치
    for r in range(n+1):
        a=f[n]//(f[r]*f[n-r])
        print(f'{a:6d}',end='')
    print() 
    
'''
출력 결과입니다.
                                   1
                                1     1
                             1     2     1
                          1     3     3     1
                       1     4     6     4     1
                    1     5    10    10     5     1
                 1     6    15    20    15     6     1
              1     7    21    35    35    21     7     1
           1     8    28    56    70    56    28     8     1
        1     9    36    84   126   126    84    36     9     1
     1    10    45   120   210   252   210   120    45    10     1
     
9번 줄은 다음과 같이 코딩할 수 있습니다.
print('{0:6}'.format(a),end='')
'''

 

● 점화식(recurrence formula)으로 계산할 수도 있습니다. 다음에 공부합니다.

     inductive case: nCr=(n-r+1)/r*nC(r-1)

    base case: nC0=1

 

2.  시에르핀스키 삼각형

홀수만 출력하면 Sierpinski triangle(시에르핀스키 삼각형)입니다.

row=10
f=[1]    #factorial 값을 미리 계산한다.
for i in range(1,row+1): f.append(i*f[i-1])
for n in range(row+1):
    print(' '*3*(row-n),end='')  #각 줄의 출력 위치
    for r in range(n+1):
        a=f[n]//(f[r]*f[n-r])
        w=' '*6
        if a%2!=0:w=f'{a:6}'
        print(w,end='')
    print() 
    
'''
출력입니다.
                                   1
                                1     1
                             1           1
                          1     3     3     1
                       1                       1
                    1     5                 5     1
                 1          15          15           1
              1     7    21    35    35    21     7     1
           1                                               1
        1     9                                         9     1
     1          45                                  45           1
     
'''

 

3. 시에르핀스키 삼각형(거북이 그림)

홀수이면 삼각형을 그렸습니다.

from turtle import*
from math import*                                     # 높이 계산에 sin 사용
from random import*                                   # 삼각형의 색깔
row=15                                                # 높이의 개수
f=[1]                                                 # 팩토리얼 값 미리 구함 
for i in range(1,row+1): f.append(i*f[i-1])
speed(0)
d=20                                                  # 삼각형의 한 변의 길이
for n in range(row+1):
    for r in range(n+1):
        a=f[n]//(f[r]*f[n-r])
        if a%2:                                       # a가 홀수이면 
            x,y=d*r-d/2*n,n*(-d*sin(60*3.14/180))+150 # 삼각형 그릴 위치
            up(); goto(x,y); down()
            r=randint(0,255)
            g=randint(0,255)
            b=randint(0,255)
            fillcolor((r,g,b))
            begin_fill()
            for i in range(3):                        # 삼각형 그림
                fd(d)
                lt(120)
            end_fill()    
ht()                                                  # 거북이 숨김          
done()

 

여러가지로 즐겨보세요.

수고하셨습니다.

안녕!

728x90
반응형

'알고리듬' 카테고리의 다른 글

[알고리듬] #81 만년 달력  (0) 2024.05.16
[알고리듬] #80 다단 출력  (0) 2024.05.16
[알고리듬] #78 4N 마방진  (2) 2024.05.01
[알고리듬] #77 홀수 마방진  (2) 2024.05.01
[알고리듬] #76 리스트 핸들링  (0) 2024.04.30