【问题标题】:Why this recursive function doesn't work? [closed]为什么这个递归函数不起作用? [关闭]
【发布时间】:2020-11-23 07:52:47
【问题描述】:

我必须编写一个代码来打印数组中数字的平均值。对于 sum,我使用了一个我在另一个时间使用的函数来计算递归和,然后只除以 n。但它不起作用。

我为什么要这样做?

int aveg(int *a, int n){
    if (n == 0){
        return 0;
    }
    else{
        return ((aveg(a, n - 1) + a[n-1]) /n);
    }
}

【问题讨论】:

  • "it doesn't work" 是一个无用的问题描述。它不会编译吗?它会崩溃吗?它会给出错误的结果吗?你有没有调试过 问题?
  • @MartinR 所说的。另外,修复minimal reproducible example

标签: c function average


【解决方案1】:

因为(a + b + c)/3 != ((a/1 + b)/2 + c)/3

相反,您可以递归计算总和,然后在最后除以n

【讨论】:

  • 谢谢!就像在 main 的最后, printf("%d", aveg(s,n) / n);对吗?
  • @paulconiel 对,虽然我不会将函数命名为 aveg,因为它实际上只是总和。
  • 还有其他方法可以使用递归计算这个平均值吗?
  • @paulconiel 当然,只需将元素总数添加为第三个参数,然后将 a[n-1] 除以它,然后再将其添加到递归结果中。
  • 我觉得我没做对,你能告诉我吗?
【解决方案2】:

您可以递归计算平均值(使用从零开始的索引),如下所示:

一个可能的实现是:

#include <stdio.h>
#include <stddef.h>

double mean(const double a[],const size_t n)
{
  if(n==0)
    return 0;
  
  return (a[n-1]+(n-1)*mean(a,n-1))/n;
}

int main()
{
  double a[]={1,2,3,4,5};
  size_t n = sizeof(a)/sizeof(*a);
  
  printf("mean: %f\n",mean(a,n));
}

与您的解决方案相比:

return ((aveg(a, n - 1) + a[n-1]) /n);

你忘记了一个 (n-1) 因子:

return (a[n-1]+(n-1)*mean(a,n-1))/n;

【讨论】:

    【解决方案3】:

    它的工作方式就像一次又一次地调用自己(函数),直到你得到真实的或你想要的输出。

    【讨论】:

    • 这可能解释了有关递归的基础知识。但它没有回答为什么这个递归函数不能产生所需的输出。
    猜你喜欢
    • 2021-10-28
    • 2017-11-29
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多