使用遞迴實現霍納法則

2021-06-28 08:50:59 字數 1456 閱讀 5073

例如,當x=3時,計算p(x)=2x^4-x^3+3x^2+x-5的值。對於多項式p(x)=2x^4-x^3+3x^2+x-5,我們按霍納法則進行變換,有:

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

=x(2x^3-x^2+3x+1)-5

=x(x(2x^2-x+3)+1)-5

=x(x(x(2x-1)+3)+1)-5

在實際的操作過程中,為了得到上式,我們沒有必要經過上述的特定變換,我們只需要乙個該多項式係數的原始列表。我們可以方便地用乙個二維**來幫助我們筆算求出這個多項式的值。該錶第一行包含了該多項式的係數(如果存在等於0的係數,也都包含進來),從最高的an到最低的a0。第二行中除了第乙個和第二個單元格用來儲存x和an外,其它單元格都用來儲存中間結果。在作了這樣的初始化後,在計算第二行的某乙個單元格的值時,用該單元格的前乙個單元格乘以x的值再加上該單元格的第一行的係數即可。用這種方式算出的最後乙個單元格的值,就是該多項式的值。 係數

a4

a3

a2

a1

a0

系數值2

-1

3

1

-5x=3

2

3*2-1=5

3*5+3=18

3*18+1=55

3*55-5=160

所以,p(3)=160。我們拿**中的單元格和多項式x(x(x(2x-1)+3)+1)-5做比較,我們會發現3*2-1=5是2x-1在x=3時的值,3*5+3=18是x(2x-1)+3在x=3時的值,3*18+1=55是x(x(2x-1)+3)+1在x=3時的值,最後3*55-5=160是x(x(x(2x-1)+3)+1)-5在x=3時的值。

程式實現

#include#include#include#define max_size 101

float horner(float , int, int, float);

int main()

srand((unsigned)time(null));

int i;

for(i = 0; i < n; i++)

/*輸入多項式的自變數值*/

printf("\nenter the value of x: ");

float x0;

scanf("%f", &x0);

/*多項式結果*/

double result = 0;

result = horner(coefficient, n, 0, x0);

printf("\nresult of this polynomial in %f is %f\n", x0, result);

return 0;

}float horner(float list, int n, int i, float x)

霍納法則 Horner s rule

霍納法則簡介 假設有n 2個實數a0,a1,an,和x的序列,要對多項式pn x anxn an xn a x a 求值,直接方法是對每一項分別求值,並把每一項求的值累加起來,這種方法十分低效,它需要進行n n 1 1 n n 2次乘法運算和n次加法運算。有沒有更高效的演算法呢?答案是肯定的。通過如...

歸併排序 霍納規則(法則) 統計逆序對

歸併排序 算導 p20 分治法中的遞迴式是基於基本模式中的三個步驟的。如先前一樣,設t n 為乙個規模為n的問題的執行時間。如果問題的規模足夠地小,如n c c為乙個常量 則得到它的直接解的時間為常量,寫作 1 假設我們把原問題分解成a個子問題,每乙個的大小是原問題的1 b。對於合併排序,a和b都是...

2 10 霍納法則 秦九韶演算法 求多項式

p n a0 x0 a1 x1 a2 x2 an xn 定義tmp an 1 0 上推一步 an 1 x an tmp tmp x k n k n 第一步 先求an x an 1 tmp k n x k n 1 第二步 第一步的結果再乘以x an 2。就是 an x an 1 x an 2 k n ...