YJ_Scribbles

#A02_Factorial 본문

이론_전공/알고리즘

#A02_Factorial

오뀨기 2020. 9. 9. 19:04

목표 : 팩토리얼을 반복문과 재귀적 방법으로 코딩 & 실행시간 측정

 

★ Factorial이란?

   - 1부터 어떤 양의 정수 n까지의 정수를 모두 곱한 것

 

★ 재귀함수란?

   - 자기자신을 호출하는 함수를 말함.

 

 

▶ 재귀함수 코드

<재귀함수로 작성된 코드>

 

▶ 반복문 코드

<반복문으로 작성된 코드>

 

 

★ 만들고자 하는 프로그램

<만들고자 하는 프로그램>

1. 지난 시간에 만든 솔루션에서 새로운 프로젝트 추가하기

   - [솔루션 위에서 마우스오른쪽 → 추가 → 새 프로젝트 → WPF 앱]을 눌러 새로운 프로젝트 추가

 

2. xaml 코드작성하는 부분에서 해야 할것

   1) 도구상자에서 필요한 도구 추가하기

     - TextBlock * 1

     - TextBox * 1

     - Button * 1

     - ListBox * 1

<도구 추가하기>

   2) TextBlock 내용 바꿔주기

     - 바꾸고자 하는 TextBlock을 선택하고 [속성 → 공용 → Text]에서 원하는 text로 바꿔준다

 

   3) 도구 이름 바꾸기

     - 'TextBox' : [속성 → 이름]에서 원하는 이름으로 바꿔준다(txtNo)

     - 'ListBox' : [속성 → 이름]에서 원하는 이름으로 바꿔준다(lstResult)

     -> 이름을 바꾸는 이유는 나중에 코드를 작성할 때 각 도구의 이름으로 함수를 작성하기 때문

 

   4) 원하는 위치에 각 도구들 위치시키기

 

3. Button 클릭하는 함수 만들기

   1) Button위에서 더블클릭하여 코드 창으로 넘어간다

   2) 아래와 같이 코드를 작성해준다

 private void Button_Click(object sender, RoutedEventArgs e)
{
	lstResult.Items.Clear();
        
	long f = long.Parse(txtNo.Text);
        
    long x = Factorial(f);
        
    long y = RFactorial(f);
        
    lstResult.Items.Add(x + ", " + y);
}

 

   3) Factorial(f) 함수 만들기 - 반복문 사용하는 코드

     - Factorial(f)에 빨간색 밑줄이 생김 → 마우스를 갖다대면 전구모양의 아이콘이 생김 → 전구모양 아이콘 클릭 → 메서드 생성 클릭

 private long Factorial(long f)
{
	long fact = 1;
	for (int i = 2; i <= f; i++)
    fact *= i;
	return fact;
}

 

   4) RFactorial(f) 함수 만들기 - 재귀함수 사용하는 코드

     - RFactorial(f)에 빨간색 밑줄이 생김 → 마우스를 갖다대면 전구모양의 아이콘이 생김 → 전구모양 아이콘 클릭 → 메서드 생성 클릭

private long RFactorial(long f)
{
 	if(f == 1)
    	return 1;
    else
    	return RFactorial(f - 1) * f;
}

 

 

4. 실행시간 측정 코드 작성하기

<실행시간 측정 코드 사용 예시>

위의 코드는 실행시간을 측정하는 코드의 예시이다. 이를 참고하여 코드 작성을 진행할 것이다.

 

   - Button_Click함수에 작성된 코드를 다음과 같이 바꿔준다

   private void Button_Click(object sender, RoutedEventArgs e)
        {
            lstResult.Items.Clear(); 	// 리스트 박스 초기화

            long f = long.Parse(txtNo.Text);

            // 반복문
            var watch = System.Diagnostics.Stopwatch.StartNew(); 	// 시간측정 시작
            long x = Factorial(f);
            watch.Stop(); 	// 시간 측정 종료

            var elapseds = watch.ElapsedTicks;	// 단위 바꿔주기
            lstResult.Items.Add("반복문 : " + x.ToString("N0") + "\n실행시간  = " + elapseds + "Ticks, " + elapseds / 10000 + "ms\n"); // 출력하기, "N0"는 뒤에는 숫자 0 -> 세자리마다 숫자를 끊어서 표현

            // recursive
            watch = System.Diagnostics.Stopwatch.StartNew(); 	// 시간측정 시작
            long y = RFactorial(f);
            watch.Stop(); 	// 시간 측정 종료

            elapseds = watch.ElapsedTicks; 	단위 바꿔주기
            lstResult.Items.Add("Recursive : " + y.ToString("N0") + "\n실행시간  = " + elapseds + "Ticks, " + elapseds / 10000 + "ms\n"); // 출력하기
        }

   - 코드 설명은 주석을 참고

   - 기존의 코드 앞 뒤로 예시 코드를 작성해준다

 

작성이 완료된 코드는 다음과 같다

<작성이 완료된 코드>

 

작성이 완료되었다면 ctrl + F5를 눌러 실행시킨다