我一直在尝试了解如何处理使用递归返回如下数字之和的函数: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));
}