霍纳算法

时间:2012-01-09 14:19:26

标签: c# visual-studio visual-studio-2010 algorithm

我对我的控制台程序有疑问。 它必须使用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();
        }
    }
}

这是计算代码的第二个选项,但计数都是错误的:

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();

我想从C ++中重写原始代码(以递归算法的形式)。

原始代码如下:

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];
}

我已经不知道怎么做了......仍然在同一个地方徘徊......

2 个答案:

答案 0 :(得分:2)

您在循环中不必要乘以(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!

int result = Horner(n);

如果它采用2个参数 - 多项式的次数和x:

,IMO会更清楚
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);

答案 1 :(得分:0)

我在c#中找到了Horner scheme的“好”源代码:

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;
}