Horner algorithm

本文关键字:algorithm Horner | 更新日期: 2023-09-27 18:19:59

我有一个关于控制台程序的问题。必须使用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];
}

我已经不知道该怎么做了。。。还在原地徘徊。。。

Horner algorithm

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

IMO,如果它取2个参数——多项式的次数和x:,它会更清楚

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

我在这里发现了Horner方案的c#中的"好"源代码:

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