2021년 9월 14일 화요일

Algorithm. Fibonacci/TowerofHanoi

 

Algorithm. Fibonacci/TowerofHanoi

[Visual Studio과 C#으로 구현]
Algorithm Fibonacci/TowerofHanoi // Week02

20210914_20615034



Recursive Algorithm = 재귀함수 
Fibonacci 수열이 대표적인 재귀함수의 예
1 1 2 3 5 8 13 ... 


Fibonacci_디자인


=> TextBlock> Text 작성
=> TextBox> Text 삭제>  레이아웃> Horizontal*ContentAligment 설정> 클릭
(HorizontalAligment는 TextBox자체 위치변경 이거 아님)
=> Button> Content 내용변경> 엔터
=> ListBox(줄이 여러개 표기될 경우)



Fibonacci_코드



< Fibonacci 수열 Recursive 함수 구현 법>

=> Button 더블클릭> 이벤트 생성> 함수 코딩

리스트박스 지우기

함수 : 정수로 바꾸어 TextBox 값 n가져오기 1부터 n까지
피보나치 함수 i 계산해서 listBox에 출력;


=> 피보나치 빨간줄 커서> 단추클릭> 메서드 생성> 함수에 가서 코딩
함수 :  i가 1이나 2면 
리턴 1;
아니면
피보나치(i-1) + 피보나치(i-2);
(굳이 굳이 위에 함수 끌고와서 공식 적용시킨다고 전체 다 힘들게 함)

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

< Fibonacci 수열 Loop 구현 법(배열사용)>

배열 100개 설정(1~101)
(총 자리는 101개/1부터 i가 시작 됨으로 쓰는 자리는 100개)
함수 : i=1 ~ n까지,  i++
만약에 i가 1이나 2면 
피보 배열 i = 1;
아니면
피보 배열 i = 피보배열 i-1+피보배열i-2;
(그냥 그 자리에서 숫자로만 계산)


(앞서 만든 숫자들은 모두 배열에 저장 됨으로, 재귀함수처럼 그 때마다 앞의 숫자들을 계산해서 생성하지 않아도 됨 >> 더 빠른 계산 도출)

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

<시간 측정하기>
var watch = System.Diagnostics.Stopwatch.StartNew();
...
watch.Stop();
var elap = watch.ElapsedTicks;
listBox.Items.Add("Ticks = " + elap);

var는 위에서 시간측정 코딩을 사용 시, 선언을 한 번 해주었다면,
아래에서는 다시 선언해주지 않음.


listBox.Items.Add("ms = " + watch.ElapsedMilliseconds);
ms는 Ticks 단위보다 큼.


Fibonacci_실행화면

실행 메인윈도우

32계산 1/5

32대입 2/5

32대입 3/5

32대입 4/5

32대입 5/5

5 대입

2 대입



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

< Tower of Hanoi Recursive 함수 구현 법>
(가장 대표적인 Recursive 함수 예)

Tower of Hanoi_코드


from(-에서) to(-로) by(-를 통해)
Hanoi(4, 'A', 'C', 'B'); //4개짜리 A에서 C로 B를 통해

만약에 n이 1이면,
첫 번째 자리에 from(A) 두 번째 자리에 to(C) 기입;
(바로 마지막으로 보내버리기)

아니면,
 하노이 n-1 from(A), by(B), to(C);
(A가 B로 C를 이용해서 감)
첫 번째 자리에 from(A) 두 번째 자리에 to(C) 기입;
하노이 n-1 by(B), to(C), from(A);
(앞에서 B로 갔으니, B가 C로 가야함 A를 통해서)
(기입 경우, 만약에 n이 1이면, 으로 가서 콘솔에 출력됨)



Tower of Hanoi_실행화면






thanks to. 

현성 (하노이 코드)
지연 (오류실행)
승준 (피보나치오류)












댓글 없음:

댓글 쓰기