3

我在这里第一次了解了霍纳规则: C++中的霍纳规则 由于我正在学习递归ATM,我想知道是否可以使用递归来实现这个算法?

int HornerR( int a[], int n, int x, int index )
{
    if (index==n) return a[n];
    else  
        return x*HornerR(a,n ,x,index+1) + a[index];
} 

我认为只有第四个参数才有可能。

4

3 回答 3

2

你可以用指针算术来做到这一点:

  1. 数组末尾的基本情况(检查 n)返回常量参数
  2. 递归案例返回当前单元格添加到变量乘递归调用
  3. 递归调用将数组移动到下一个单元格并更新计数器 (n)

基本上,这使您可以通过将数组移动到下一个位置并发送它(并始终使用第一个单元格)来计算索引变量,而不是每次都发送整个数组

于 2012-04-16T04:46:37.340 回答
1

您可以在函数中使用 3 个参数按如下方式实现该函数,前提是数组 pi 包含从索引 0 到度+1 的从最高度到 0 的系数。例如 3x^2 + 2x^1 + 1 => pi[3] = { 3,2,1}

int compute_by_horner(int *pi, int degree, int x)
{
int i, j;

if (degree == 0)
{
    return pi[0];
}

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

}
于 2015-10-24T17:40:36.500 回答
0

与其传递索引,不如将其a视为指针(因为它是)。除此之外,您还需要减少n,并跟踪它是否已经减少到零,而不是跟踪是否index==n.

于 2012-04-16T04:31:36.237 回答