尝试使用迭代(无需堆栈)的方法:
int n1 = 0;
int n2 = 0;
void MyWay(int start1, int start2, int plus1, int plus2, int v)
{
n1 = start2 + plus2 * v;
n2 = start1 + plus1 * v;
for (int i = 0, pow = 1 << v; i < pow; i++)
{
if ((i & 1) == 0)
{
int temp = n2;
n2 = n1;
n1 = temp;
}
for (int mask = i; mask > 0 && (mask & 1) == 0; mask >>= 1)
{
n1 += plus1;
n2 += plus2;
}
Console.WriteLine(n1 + n2);
}
}
应该这样调用:
MyWay(2, 3, 10, 20, 4);
你的示例中的所有常量都被传递给了函数,因此它是完全通用的。
另一个重要的事实是,在完成函数后,n1和n2的值将与您的递归方法完成后的值完全相同。
关于性能:
当然,这样做会提高一些时间,但不是很多。但是对于大的输入参数来说,这将有所改善。
此外,我的方法不消耗额外的内存(递归和堆栈方法会消耗)。
有关性能的更新:
我已经在本地测试了您和我的方法-每个方法都调用1000000次。 结果如下:
递归:225.1774毫秒
迭代:152.1194毫秒
[更新]如果您在函数完成后不需要n1和n2,则可以使代码更短:
void MyWayTwo(int start1, int start2, int plus1, int plus2, int v)
{
plus1 += plus2;
int n = start1 + start2 + plus1 * v;
for (int i = 0, pow = 1 << v; i < pow; i++)
{
for (int mask = i; mask > 0 && (mask & 1) == 0; mask >>= 1)
n += plus1;
Console.WriteLine(n);
}
}
调用MyWayTwo(2, 3, 10, 20, 4);
时的输出:
125
125
155
155
215
215
245
245
335
335
365
365
425
425
455
455
更加简化的解决方案:
void MyWayTwo(int s1, int s2, int p1, int p2, int v)
{
p1 += p2;
s1 += s2;
for (int i = 1 << v, p = i << 1; i < p; i++)
{
for (int m = i; (m & 1) == 0; m >>= 1)
s1 += p1;
Console.WriteLine(s1);
}
}