Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更简单地重写递归算法-Euler 15_C#_Recursion - Fatal编程技术网

C# 更简单地重写递归算法-Euler 15

C# 更简单地重写递归算法-Euler 15,c#,recursion,C#,Recursion,我想重写我用来以非递归方式解决ProjectEuler问题15的这个算法的功能 是的,我意识到有很多更好的方法来解决实际问题,但作为一个挑战,我希望尽可能简化这个逻辑 public class SolveRecursion { public long Combination = 0; public int GridSize; public void CalculateCombination(int x = 0, int y = 0) { if (

我想重写我用来以非递归方式解决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++;
    }
}
编辑:下面是另一个简单的函数,它以两种方式编写:

//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;
}
如有任何提示,将不胜感激。我尝试过动态规划解决方案,它使用了一种更基于数学的方法,并用一个方程成功地解决了这个难题


我想知道——第一个算法可以简单地说是非递归的吗?

非递归的解决方案是:

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网格的答案是CN+M,N,其中C是组合函数-

如果您想保留算法而不使用递归调用,则可能会重复,因此可以使用堆栈和循环来模拟递归,但是我不认为这样做有什么意义。谢谢…我同意做堆栈和循环不会让事情变得更简单。。
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;