我一直在尝试了解如何处理使用递归返回如下数字之和的函数:1 + 2 + 3 + 4 ... 4n

我尝试了不同的情况,但没有成功,我想知道是否有任何数学方法可以解决该问题并将其转换为代码。我知道如果我使用此功能:

int MyFunction(int x)
{
  if (x==0)
   return 0;
  else{
    return x+MyFunction(x-1);
  }
}


并且我使用x = 3它将返回1 + 2 + 3,它等于6,但就我而言,我想做类似的事情,但最多等于数字的4倍。例如,如果x = 1,则由于4(1)= 4,它将返回1 + 2 + 3 + 4。然后返回的是这些数字的和等于10

我试图考虑将x转换为4 * x

int MyFunction(int x)
{
  if (x==0)
   return 0;
  else{
    return 4*x+MyFunction(x-1);
  }
}


当然,这是行不通的,我还尝试过考虑,因为所有内容都是相同的,但因数是MyFunction(4(x-1))的4倍,但显然我没有正确考虑这一点。我想提出建议,至少要了解其背后的数学以及如何将其与代码关联

最佳答案

非递归解

有限算术级数的成员之和称为算术级数。例如,考虑总和:

1 + 2 + 3 + ... 4n-1 + 4n


通过取相加的项数(此处为4n),乘以级数中第一个和最后一个数的和(此处为1 + 4n = 4n + 1),然后除以2,可以快速找到该和。

您正在寻找的公式是:

sum = 2n(4n+1)


可能的实现可以是:

int MyFunction(int n)
{
    assert(n>0);

    return 2*n*(4*n+1);
}


注意:我们不检查可能的溢出



递归解

int recursive_sum(int k)
{
  return (k>0) ? k+recursive_sum(k-1) : 0;
}

int recursive_MyFunction(int n)
{
  assert(n>0);

  return recursive_sum(4*n);
}




检查两种方法是否给出相同的结果

#include <cassert>

int MyFunction(int n) { ... as before ...}
int recursive_MyFunction(int n) { ... as before ...}

int main()
{
  int n = 10; // whatever you want

  assert(recursive_MyFunction(n)==MyFunction(n));
}

09-06 05:39