【问题标题】:My recursive function does not return the correct value我的递归函数没有返回正确的值
【发布时间】:2013-03-12 13:29:45
【问题描述】:

我写了一个递归函数来计算一个双精度数组的总和。由于某些原因,我的递归函数返回的值不正确。实际上,我的递归总和与我的迭代总和不匹配。我知道我在某个地方犯了一个小错误,但我看不出在哪里。您的帮助将不胜感激。我只粘贴了递归函数。我在 Visual Studio 上使用 C++。谢谢!

double recursive_sum(double array_nbr[], int size_ar)
{ double rec_sum=0.0;
if( size_ar== 0) 
    return -1;
else if( size_ar> 0)
       rec_sum=array_nbr[size_ar-1]+recursive_sum(array_nbr,size_ar-1);

return  rec_sum;
}

 //####  Output######


 The random(s) number generated in the array =
 0.697653  |  0.733848  |  0.221564  |



 Recursive sum: 0.653066

 Iterative sum: 1.65307

 Press any key to continue . . .

【问题讨论】:

    标签: c++ function recursion sum double


    【解决方案1】:

    嗯,因为没有元素的总和是零,而不是负一。

    if (size_ar == 0.0)
        return 0.0;
    

    这样想:sum(1,2,3)sum(1,2) + sum(3) 相同,就像它与 sum(1,2,3)+sum() 相同 — 在所有三种情况下,您将 1、2 和 3 加在一起,只是略有不同方法。这也是为什么没有元素的乘积是一的原因。

    【讨论】:

      【解决方案2】:

      尝试更改“if(size_ar== 0) return -1;”返回 0。

      【讨论】:

      • 谢谢,乔治,问题已解决。
      【解决方案3】:

      虽然这并不能解释输出中的巨大差异,但要记住的另一件事是,一旦您解决了返回 -10 的问题... IEEE 浮点数的操作顺序运算不一定是可交换的,因此请确保在执行递归与迭代方法时,以完全相同的顺序将数字相加,否则您的输出可能仍会相差一些 epsilon 值。

      例如,目前在您的递归方法中,您正在将数组最后一个成员的值与数组的第一个成员反向相加。由于浮点数学的非交换性,这可能会给你一个稍微不同的值(小 epsilon),而不是你从第一个到最后一个对数组中的值求和。这可能不会显示在简单的cout 上,其中浮点值被截断到特定的固定小数位,但是如果您尝试在两个不同的求和上使用== 操作而不包含一些 epsilon 值,结果可能仍然测试为假。

      【讨论】:

      • 只要所有的加号都具有相同的符号,它很少有意义。但是,如果您绝对必须非常非常准确地求和(这种情况并不常见,超越函数很快就会吃掉准确性),那么就有 Kahan 算法,它具有恒定的误差。或成对求和,有O(log n) 错误。
      猜你喜欢
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      相关资源
      最近更新 更多