이 문제는 주로 알고리즘에 초점을 맞추고 있습니다.
이 예는 생각을 제공하고 있습니다. 일반적인 방법을 원합니다. 따라서 예는 단지 당신의 생각에 대해 더 명확하게하기 위해 사용됩니다.
일반적으로 루프는 재귀로 변환 될 수 있습니다.
예 :
for(int i=1;i<=100;++i){sum+=i;}
관련 재귀는 다음과 같습니다.
int GetTotal(int number)
{
if (number==1) return 1; //The end number
return number+GetTotal(number-1); //The inner recursive
}
마지막으로이를 단순화하려면 꼬리 재귀가 필요합니다.
int GetTotal (int number, int sum)
{
if(number==1) return sum;
return GetTotal(number-1,sum+number);
}
그러나 대부분의 경우 대답하고 분석하기가 쉽지 않습니다. 내가 알고 싶은 것은 :
1) 루프 (for / while ……)를 재귀로 변환하는 "일반적인 일반적인 방법"을 얻을 수 있습니까? 그리고 회심을 할 때 어떤 종류의 것들에주의를 기울여야합니까? 변환 과정뿐만 아니라 일부 샘플과 설득 이론으로 자세한 정보를 작성하는 것이 좋습니다.
2) "재귀"는 선형 재귀와 꼬리 재귀의 두 가지 형태가 있습니다. 그렇다면 어느 것이 변환하는 것이 더 낫습니까? 우리는 어떤 "규칙"을 마스터해야합니까?
3) 때때로 우리는 재귀의 "역사"를 유지해야 할 때가 있습니다.
예 :
List<string> history = new List<string>();
int sum=0;
for (int i=1;i<=100;++i)
{
if(i==1) history.Add(i.ToString()+"'s result is:1.");
else
{
StringBuilder sub = new StringBuilder();
for(int j=1;j<=i;++j)
{
if(j==i) sbu.Append(j.ToString());
else
{
sub.Append(j.ToString()+"+");
}
}
sum +=i;
sbu.Append("'s result is:"+sum+Environment.NewLine);
}
}
아래 결과는 다음과 같습니다.
1의 결과는 1입니다.
1 + 2의 결과는 3입니다.
1 + 2 + 3의 결과는 6입니다. …………
그러나 재귀 기반 알고리즘은 마지막 결과를 얻는 데 중점을두고 콜백 반환을 수행하기 때문에 기록을 재귀로 유지하는 것이 어렵다고 생각합니다. 따라서 이러한 모든 작업은 프로그래밍 언어가 메모리를 자동으로 스택 형태로 할당하여 유지 관리하는 스택을 통해 수행됩니다. 그리고 어떻게 "수동으로"각 "스택 값"을 꺼내고 재귀 알고리즘을 통해 여러 값을 반환 할 수 있습니까?
그리고 "재귀 알고리즘에서 루프까지"는 어떻습니까? 그것들은 서로 전환 될 수 있습니까? (이론적으로 이론적으로 이루어져야한다고 생각하지만, 더 정확한 것들이 내 생각을 증명하기를 원합니다) .