2012-01-09 13 views
0

私のコンソールプログラムに関する質問があります。 Hornerアルゴリズムを使用してカウントする必要があります。例外はスローされませんが、正しい結果は得られません。ここでHornerアルゴリズム

誰もが私が何をするかわからないので、私は、非常に感謝される私を助けることができれば...

は私のプログラムのコードです:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Consola_Horner_Rekurencyjnie 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int n; 

      Console.WriteLine("Podaj stopień wielomioanu: "); 
      n = Convert.ToInt32(Console.ReadLine()); 

      int[] a = new int[++n]; 

      Console.WriteLine("Podaj wartosc a: "); 

      for (int i = 0; i < n; i++) 
      { 
       Console.WriteLine("a [" + i + "] = "); 
       a[i] = Convert.ToInt32(Console.ReadLine()); 
      } 

      int x; 

      Console.WriteLine("Podaj x:"); 
      x = Convert.ToInt32(Console.ReadLine()); 

      int Horner; 
      Horner = a[0]; 

      for (int i = 1; i < n; i++) 
      { 
       Horner = Horner * (i - 1) * x + a[i]; 
      } 

      Console.WriteLine("Wynik to:" + Horner); 
      Console.ReadLine(); 
     } 
    } 
} 

は、これが第二の選択肢でありますコードを計算しますが、カウントはすべて間違っている:私は+ +(再帰アルゴリズムの形で)Cから元のコードを書き換えてみたかった

Func<int, int> Horner = null; 
Horner = (i) => (i == 0) ? a[0] : Horner(i - 1) * x + a[i]; 

Console.WriteLine("Wynik to:" + Horner(x)); 
Console.ReadLine(); 

元のコードは次のようになります。私はそれを行う方法がわからないすでに

int Horner; 
int n; 
int *a = new int[n]; 
int x; 


int main() 
{ 

     cout <<"Podaj stopień wielomianu: "; 
     cin >> n; 
     cin.ignore(); 


     cout << "Podaj wartość a: \n"; 
     for (int i = 0; i <= n; i++) 
     { 
      cout <<"a[" <<i<<"] = "; 
      cin >> a[i]; 
      cin.ignore(); 
     } 

     cout <<"Podaj x: "; 
     cin >> x; 
     cin.ignore(); 

     cout <<"Wynik to: " << Horner(n); 

     getchar(); 
     return 0; 
} 

int Horner (int i) 
{ 
     if (i == 0) 
      return a[0]; 
     else 
      return Horner (i - 1) * x + a[i]; 
} 

...まだ同じ場所でさまよう...

+1

あなたは何を求めているのかはっきりしていません – sll

+0

本当にコードで何をしようとしていますか?これはユーザー入力を受け付けるアプリケーションですか?あなたのカウントがオフになっている場合も、forループを見てください。C#はインデックスに基づいて0ですので、1でカウントを開始するように設定している場合は、<ステートメントを変数にする必要があります。 – MethodMan

答えて

2

あなたはunnecesarilyに(i-1)乗じていますあなたのループ。

変更、それに:

 int Horner; 
     Horner = a[0]; 


     for (int i = 1; i < n; i++) 
     { 
      Horner = Horner * x + a[i]; 
     } 

かにさらに良い:

 int Horner = 0; 

     foreach (int wspolczynnik in a) 
     { 
      Horner = Horner * x + wspolczynnik; 
     } 

あなたはおそらくHorner(i-1) * x + a(i)を持っていたいくつかの実装を見ましたが、(i-1)することは、この場合、配列のインデックスではなく、乗数です。

編集:

一方、あなたの再帰バージョンは一つのパラメータを取ります - 多項式の次数を、そしてあなたは、xとそれを呼び出そうとしました。 nと一緒にやって!

Func<int, int, int> Horner = null; 
Horner = (i, x) => (i == 0) ? a[0] : Horner(i - 1, x) * x + a[i]; 

int result = Horner(n, x); 
+0

再帰的メソッドを使用してカウントする方法なので、コードのバージョン(Horner(i - 1)* x + a [i])でなければなりません。 以前に指定された方法(Horner * x + a [i])は対話の方法です。 – mcshow

+0

@mcshowええ、あなたは単純にそれらを混ぜて:)あなたが投稿した最初の(反復的な)コードは、その偽(i - 1)を持っています。 – soulcheck

+0

C + +の元のコードの上に貼り付けて、C#に変換しようとしましたが、他に何ができるのかわかりません...私のプログラムは結果が悪いです。 – mcshow

0

私はここにHorner schemeのためのC#で "良い" のソースコードを発見した:

多項式の次数、およびX -

int result = Horner(n); 

IMO 2つのパラメータを取った場合より明確になります

private IEnumerable<int> getDivisors(int n) 
{ 
    if (n == 0) 
     return (IEnumerable<int>)new int[] { 0 }; 
    else 
     return Enumerable.Range(-Math.Abs(n), 2 * Math.Abs(n) + 1) 
      .Where(a => a != 0) 
      .Where(a => (n % a) == 0); 
} 
private bool findRootWithHornerScheme(int[] coefficientsA, int x, out int[] coefficientsB) 
{ 
    var lenght = coefficientsA.Length; 
    var tmpB = new int[lenght]; 
    coefficientsB = new int[lenght - 1]; 
    tmpB[0] = coefficientsA[0]; 
    for (int i = 1; i < lenght; i++) 
    { 
     tmpB[i] = tmpB[i - 1] * x + coefficientsA[i]; 
    } 
    //ak je posledny koefiecient B == 0 ,tak zadane x je korenom polynomu 
    if (tmpB[lenght - 1] == 0) 
    { 
     Array.Copy(tmpB, coefficientsB, lenght - 1); 
     return true;//bol najdeny koren 
    } 
    //nebol najdeny koren a metoda vrati false 
    return false; 
}