この問題は主にアルゴリズムに焦点を当てており、おそらく抽象的でより学術的なものです。
例は思考を提供しているので、一般的な方法を使用したいので、例はあなたの思考についてより明確にするためにのみ使用されます。
一般的に、ループは再帰に変換できます。
例えば:
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……)を再帰に変換する「一般的な一般的な方法」を取得できますか?そして、変換を行う際にどのようなことに注意する必要がありますか?変換プロセスと同様に、いくつかのサンプルとあなたのpersudo理論で詳細な情報を書くほうが良いでしょう。
2)「再帰」には、線形再帰と末尾再帰の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…………
ただし、再帰ベースのアルゴリズムは最後の結果を取得してコールバックを返すことに焦点を当てているため、履歴を再帰的に保持するのは難しいと思います。したがって、これらのすべては、スタックの形でメモリを自動的に割り当てるプログラミング言語によって維持されるスタックを通じて行われます。そして、どのようにして「手動で」各「スタック値」を取り出し、再帰アルゴリズムを介して複数の値を返すことができますか?
「再帰アルゴリズムからループまで」はどうですか?それらを相互に変換することはできますか(理論的には行う必要があると思いますが、自分の考えを証明するためにより正確なものが欲しいです)。