C++에서 Horner의 규칙을 사용하여 다항식 값 찾기

Jay Shaw 2023년10월12일
  1. 루프를 역방향으로 반복하여 C++에서 Horner의 규칙을 사용하여 다항식 값 찾기
  2. Loop Forward를 반복하여 C++에서 Horner의 규칙을 사용하여 다항식 값 찾기
  3. 재귀를 사용하여 C++에서 Horner의 규칙을 사용하여 다항식 값 찾기
  4. 결론
C++에서 Horner의 규칙을 사용하여 다항식 값 찾기

Horner의 규칙은 다항식의 값을 계산하기 위한 효율적인 알고리즘입니다.

x = 4에서 다항식 p(x) = 6x^3 - 2x^2 + 7x + 5를 고려하십시오. C++에서 Horner의 규칙을 사용하여 계산하려면 첫 번째 계수 6에 x의 값(4)을 곱하고 두 값의 곱인 24를 다음 계수 -2에 더합니다.

결과에 4를 곱하고 다음 계수에 더합니다.

이 프로세스는 방정식의 계수 수에 대해 반복됩니다. 남은 최종 제품은 다항식의 값입니다.

이 기사에서는 위의 규칙을 컴퓨터 코드로 변환하여 C++에서 Horner의 규칙을 사용하여 다항식의 값을 찾는 방법을 설명합니다.

다항식을 고려해 봅시다:

<사업부>
$$
p(x) = 6(x^3) - 2(x^2) + 7x + 5
$$

x = 4이면 다항식의 값은 385입니다.

루프를 역방향으로 반복하여 C++에서 Horner의 규칙을 사용하여 다항식 값 찾기

C++에서 Horner의 규칙을 사용하여 역방향 루프를 통해 다항식의 값을 찾는 프로그램을 살펴보겠습니다.

  1. 코드의 첫 번째 줄은 라이브러리 패키지 iostream을 가져옵니다. 두 번째 줄에서 네임스페이스는 std로 정의됩니다.

  2. 메서드 int Horner()는 계수 목록을 전달할 포인터 배열 a, 다항식의 차수를 저장하는 정수 변수 n 및 다른 정수 변수 x의 세 가지 매개변수로 생성됩니다. 다항식의 값을 x에 저장합니다.

    int Horner(int* a, int n, int x)
    
  3. 다항식의 곱을 서로 더하는 방법을 설명합니다. 정수 변수 result가 생성되고 배열 a[n]의 마지막 요소로 초기화됩니다.

    int result = a[n];
    

    참고: 배열의 크기로 착각하지 마십시오. n번째 위치에서 배열 a의 요소로 변수 result를 초기화합니다.

  4. for 루프가 생성되어 배열 a의 마지막 요소에서 0번째 인덱스까지 루프를 반전시킵니다. result 변수의 값은 각 루프 반복에 대해 업데이트됩니다.

    for (int i = n - 1; i >= 0; --i) 
    

    첫 번째 반복에서 a[n]의 값에 x를 곱한 다음 배열의 이전 요소인 a[n-1]에 추가합니다. 배열 {2,3,4}의 경우 루프는 마지막 요소 a[n](4)를 가져와 x와 곱한 다음 n-1 요소에 추가합니다. 배열의 3입니다.

    이러한 이유로 main 함수에서 초기화하는 동안 계수를 반전시켜야 합니다. result의 값은 메서드의 끝에서 반환됩니다.

  5. main 함수 내에서 Horner 메소드의 첫 번째 매개변수로 전달하기 위한 배열이 생성됩니다. 루프가 역방향으로 반복되기 때문에 배열 내부의 계수 값이 반전된다는 점에 유의하십시오.

  6. Horner라는 메서드에서 반환된 결과를 저장하기 위해 정수 변수 sol이 생성됩니다.

    첫 번째 매개변수에는 생성 중인 배열이 전달됩니다. 두 번째 매개변수는 방정식의 다항식 차수 3을 전달하고 x의 세 번째 매개변수 값이 전달됩니다.

    int sol = Horner(arr, 3, 4);
    

암호:

#include <iostream>
using namespace std;
int Horner(int* a, int n, int x) {
  int result = a[n];
  for (int i = n - 1; i >= 0; --i) result = result * x + a[i];
  return result;
}

int main() {
  int arr[4] = {5, 7, -2, 6};
  int sol = Horner(arr, 3, 4);
  cout << sol;
}

출력(C++의 역방향 루프 Horner 규칙):

385

Loop Forward를 반복하여 C++에서 Horner의 규칙을 사용하여 다항식 값 찾기

루프를 정방향으로 실행해야 하는 경우 마지막 예와 달리 배열의 포인터를 역참조하여 첫 번째 요소를 가져오고 루프를 되돌리는 대신 정방향으로 실행할 수 있습니다. C++에서 Horner의 규칙을 구현하기 위해 루프를 사용하는 또 다른 방법입니다.

코드가 무엇을 하는지 이해해 봅시다:

  1. 첫 번째 코드 라인은 라이브러리 패키지 iostream을 가져옵니다.

  2. 이전 예제와 유사하게 Horner 메소드가 3개의 매개변수로 생성됩니다.

    int Horner(int a[], int n, int x)
    
  3. 변수 result가 생성되고 포인터를 역참조하여 배열의 첫 번째 요소로 초기화됩니다. 포인터 *aarr[0]을 쓰는 것과 동일합니다.

    int result = *a;
    

    이전 예제에서 Horner 메서드는 해당 배열에 연결된 크기 구성 요소가 필요했습니다. int result = a[n]; 마지막 요소를 가리킵니다. 여기서는 그냥 역참조됩니다.

  4. 1에서 n까지 반복되는 for 루프가 생성됩니다. 각 반복에서 result 변수의 값은 다항식의 값으로 업데이트됩니다.

    result의 값은 메서드의 끝에서 반환됩니다.

    for (int i = 1; i < n; i++) result = result * x + a[i];
    return result;
    
  5. main 함수 내에서 계수 값으로 배열이 생성됩니다. 여기에 사용된 다항식은 다음과 같습니다.

    $$
    p(x) = 5x^4 + 3x^3 - 2x^2 + 4x - 6; x=-2
    $$

    배열은 다항식의 계수(int arr[] = {5,3,-2,4,-6};)를 취하여 생성됩니다.

  6. 변수 n은 다항식의 차수를 보유합니다. n의 값은 다음과 같이 계산됩니다. n = 배열 크기 -1.

    int n = (*(&arr + 1) - arr) - 1;
    //  n =	  size of the array		    -   1;
    
  7. 메소드 Horner는 배열, n의 값 및 x의 값을 전달하여 호출됩니다. 반환된 결과는 새로운 정수 변수에 저장되어 출력됩니다.

    int sol = Horner(arr, n, -2);
    std::cout << "Value of polynomial = " << sol;
    

암호:

#include <iostream>
int Horner(int a[], int n, int x) {
  int result = *a;
  for (int i = 1; i < n; i++) result = result * x + a[i];
  return result;
}

int main() {
  int arr[] = {5, 3, -2, 4, -6};
  int n = (*(&arr + 1) - arr) - 1;
  int sol = Horner(arr, n, -2);
  std::cout << "Value of polynomial = " << sol;
}

출력(C++에서 정방향 루프 Horner의 규칙):

Value of polynomial = -20

재귀를 사용하여 C++에서 Horner의 규칙을 사용하여 다항식 값 찾기

지금까지 C++에서 호너의 법칙을 이용하여 다항식의 값을 구하는 방법을 배웠습니다. 루프를 반복하고 누산기 변수를 사용하여 카운트를 업데이트하여 수행되었습니다.

이 예에서 다항식의 값은 재귀에 의해 계산됩니다. 코드를 살펴보겠습니다.

  1. 첫 번째 코드 라인은 iostream 패키지를 가져오고 네임스페이스를 std로 정의합니다.

    #include <iostream>
    using namespace std;
    
  2. 메소드 Horner는 포인터 정수 *pi, 다항식의 차수인 다른 정수 변수 degree(이전 예에서 n로 사용됨) 및 xx에서 값을 전달하기 위한 것입니다.

    int Horner(int* pi, int degree, int x)
    
  3. 재귀 함수의 특징은 조건이 만족될 때까지 루프처럼 자신을 계속 호출하여 시간 복잡도를 줄이는 것입니다. 조건의 경우 if 문은 정도 값이 0으로 감소한 경우에만 0번째 인덱스에서 pi 값을 반환합니다.

    if (degree == 0) {
      return pi[0];
    }
    
  4. 재귀를 적용하기 위해 값을 반환하는 대신 Horner 메서드를 다시 호출합니다.

    return Horner(pi, degree - 1, x) * x + pi[degree];
    

    위의 구문은 Horner 메서드가 다항식 존재 정도에 대해 반복적으로 자신을 호출하도록 유지합니다. 방정식에서 다항식의 차수는 가장 높은 지수입니다.

    마지막 예에서 사용한 방정식을 고려하면 다음과 같습니다.

    <사업부>
    $$
    p(x) = 5x^4 + 3x^3 - 2x^2 + 4x - 6; x=-2
    $$

다항식의 차수는 4입니다.

이는 재귀가 n+1 = 5번(배열 크기) 동안 반복된다는 것을 의미합니다. 각 반복에서 메서드는 정도 값이 0으로 줄어들 때까지 자체적으로 호출합니다.

0에 도달하면 재귀는 *p[0] 요소를 가져와 이전 메소드 호출로 전달합니다.

return Horner(pi, degree - 1, x) * x + pi[degree];

봉투 안에 있는 봉투를 마지막 봉투까지 뜯었다가 다시 접는 것과 같습니다. 마지막 메서드 호출의 값이 이전 메서드 호출로 전달되고 계산이 실행됩니다.

  • main 함수 내에서 방정식의 계수를 Horner 메서드에 전달하기 위해 정수 배열이 생성됩니다. 그런 다음 매개 변수 값이 메서드에 전달됩니다.

    int sol = Horner(arr, 4, -2);
    

    배열은 arr, 차수는 4, x의 값은 -2입니다.

  • 마지막으로 반환된 결과는 정수 변수 sol에 저장되고 출력됩니다.

  • 암호:

    #include <iostream>
    using namespace std;
    
    int Horner(int* pi, int degree, int x) {
      if (degree == 0) {
        return pi[0];
      }
      return Horner(pi, degree - 1, x) * x + pi[degree];
    }
    int main() {
      int arr[] = {5, 3, -2, 4, -6};
      int sol = Horner(arr, 4, -2);
      cout << "Value of Polynomial using recursion = " << sol;
    }
    

    출력:

    Value of Polynomial using recursion = 34
    

    결론

    이 문서에서는 C++에서 Horner의 규칙을 사용하여 다항식의 값을 찾는 방법을 설명합니다. 세 가지 방법은 독자에게 훌륭한 학습 도구가 될 수 있는 다양한 시간 복잡도를 가지고 있습니다.

    코드를 직접 작성하고 다시 돌아와서 힌트를 얻는 것이 좋습니다. 독자는 C++에서 Horner의 규칙을 사용하여 다항식의 값을 찾는 개념을 쉽게 이해할 것입니다.

    관련 문장 - C++ Math