【问题标题】:Horner's Rule C/C++ Using Recursion使用递归的霍纳规则 C/C++
【发布时间】:2015-10-25 01:40:36
【问题描述】:

我第一次在这里了解到霍纳法则: Horner's rule in 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];
} 

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

【问题讨论】:

  • 是的,应该可以用递归编写试试看。如果您有问题,您可以提出另一个问题(或编辑这个问题)并从那里开始。
  • 我想知道是否有一种方法可以在没有索引参数的情况下实现它...??
  • 实际上,这与我想出的完全一样,而且似乎有效。如果有没有第四个参数的方法我没有想出来。
  • 参数n的唯一原因是JavaC中的数组没有长度函数,这将是3个参数,循环版本是2。我认为额外的参数是必要的。
  • 有道理。我不得不想出一个不使用 index 参数的解决方案。我猜应该有可能

标签: c++ recursion


【解决方案1】:

你可以用指针算术来做:

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

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

【讨论】:

  • @JerryCoffin 我把它改成了一个方法。
  • 是的——好多了(至少在 IMO)。
  • @JerryCoffin 自从他第一次提出这个问题以来,我一直在思考这个问题,当我弄清楚时有点兴奋。
  • 我不能怪你——这是一个相当巧妙的小把戏。看看我的回答,虽然考虑的解决方案基本相同,但我可能只是有点模糊了——这可能不足以导致答案,除了(也许)可以自己快速轻松地解决问题的人。
【解决方案2】:

您可以在函数中使用 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];

}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多