再帰関数をより簡単にしようとします。たとえば、階乗疑似コードの小さな例を見てみましょう。
int fact(n)
{
if(n==1 || n==0) return 1;
else
return (n*fact(n-1));
}
これにより、関数のスタックが作成されます。これを呼び出すとfact(3)
、次のようなスタックが作成されます。
fact(0)
fact(1)
fact(2)
fact(3)
各関数がスタックにプッシュされます。最初fact(3)
に呼び出されます。fact(3)
を呼び出しますfact(2)
。パスの後 -
スタックの構築:
fact(0)
fact(1) fact(1)
fact(2) fact(2) fact(2)
empty --> fact(3) ---> fact(3) --> fact(3) --> fact(3)
これで、関数は をキャッチn=0
して返します1
。これで、関数が飛び出し始めます。
スタック :
fact(0) -----> (returns 1) = 1
fact(1) -----> (returns 1) * 1 (1's popped out)
fact(2) -----> (returns 2) * 1 (1 is actually 1*1)
fact(3) -----> (returns 3) * (2 = 2*1*1)
----->6
EDIT:機能的にポップを追加しました。ソート スタックについては、@P0W の回答をご確認ください。
小さな例を取り上げて、スタックを構築してみてください。次に、複雑なものに進みます。練習が鍵であることを忘れないでください。これが、再帰関数がスタックとして機能する方法です。
それが役に立てば幸い。:)