0
이 알고리즘의 기능을 재귀 적으로 재 작성하여 ProjectEuler 문제 15을 해결하는 데 사용했습니다.재귀 알고리즘을보다 간단하게 다시 작성 - Euler 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;
}
: 다음 두 가지 방법으로 작성된 또 다른 간단한 함수입니다. 동적 프로그래밍 솔루션 (더 많은 수학 기반 접근법 사용)과 퍼즐을 성공적으로 풀 수있는 방정식을 시도했습니다.
궁금한 사항 -이 첫 번째 알고리즘을 간단히 비 재귀 적으로 만들 수 있습니까?
가능한 복제본 [재귀에서 반복으로 이동하는 방법] (http://stackoverflow.com/questions/159590/way-to-go-from-recursion-to-iteration) –
재귀 호출을 사용하지 않고 알고리즘을 유지하기를 원한다는 의미이므로 스택과 루프가 재귀를 모방하는 데 사용될 수 있지만 그렇게 할 시점은 없습니다. – tia
감사합니다 ... 스택 및 루프를 수행하면 작업이 단순 해지지 않을 것이라는 데 동의했습니다. –