我一直试图理解如何处理一个返回这样的数字之和的函数: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,它将返回1 + 2 + 3 + 4,因为4(1)= 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)),但显然我并没有正确地考虑这一点。我想建议至少要理解它背后的数学以及如何将它与代码相关联
答案 0 :(得分:1)
非递归解决方案
有限算术级数的成员之和称为算术级数。例如,考虑总和:
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));
}