我想以非递归的方式重写此算法的功能(我用它来解决ProjectEuler问题15)。
是的,我意识到有很多更好的方法可以解决实际问题,但作为一项挑战,我希望尽可能地简化这种逻辑。
public class SolveRecursion
{
public long Combination = 0;
public int GridSize;
public void CalculateCombination(int x = 0, int y = 0)
{
if (x < GridSize)
{
CalculateCombination(x + 1, y);
}
if (y < GridSize)
{
CalculateCombination(x, y + 1);
}
if (x == GridSize && y == GridSize)
Combination++;
}
}
测试:
[Test]
public void SolveRecursion_GivenThree_GivesAnswerOf20Routes()
{
solveRecursion.GridSize = 3;
solveRecursion.CalculateCombination();
var result = solveRecursion.Combination;
Assert.AreEqual(20, result);
}
[Test]
public void SolveRecursion_GivenFour_GivesAnswerOf70Routes()
{
solveRecursion.GridSize = 4;
solveRecursion.CalculateCombination();
var result = solveRecursion.Combination;
Assert.AreEqual(70, result);
}
编辑:这是另外两种简单的函数:
//recursion
private int Factorial(int number)
{
if (number == 0)
return 1;
int returnedValue = Factorial(number - 1);
int result = number*returnedValue;
return result;
}
//loop
private int FactorialAsLoop(int number)
{
//4*3*2*1
for (int i = number-1; i >= 1; i--)
{
number = number*i;
}
return number;
}
任何提示都将不胜感激。我尝试过动态编程解决方案(使用更多基于数学的方法),以及成功解决难题的方程式。
我想知道 - 这第一个算法是否可以非递归,简单?
答案 0 :(得分:0)
非递归解决方案是:
const int n = 4;
int a[n + 2][n + 2] = {0};
a[0][0] = 1;
for (int i = 0; i < n + 1; ++i)
for (int j = 0; j < n + 1; ++j) {
a[i][j + 1] += a[i][j];
a[i + 1][j] += a[i][j];
}
std::cout << a[n][n] << std::endl;
仅仅是为了获取信息,这个问题应该在论文中得到解决,NxM网格的答案是C(N + M,N),其中C是组合函数 - http://en.wikipedia.org/wiki/Combination