2011-04-11 12 views
0
void factorial(int n) 
{ 

if(n ==0) 
return 1; 

int value = n*factorial(n-1); 
printf("the value is %d", value) 
} 

関数は4C#再帰スタック割り当て

ので、行われたコールの数が5

です入力を想定して、私はどのようにスタック、関数が呼び出されるたびに知りたいと思いました割り当てが行われます。以下

void factorial(4) 
{ 

if(4 == 0) 
return 1; 

int value = 4*factorial(3) 
printf ("the value is %d",value); 

} 

void factorial(3) 
{ 
if(3 ==0) 
return 1; 

int value = 3* factorial (2); 




} 

は私の質問は、各呼び出しのために、上記のコードは

+0

printfはC#ではありません、Cです - 再タグ付けする必要がありますか? –

答えて

0

生成のコードが1つのスタック }

}で述べたように生成されるが起こるように、それはいくつかのことです元の例では、他には何もありません。実際にが渡されると、ロールアウトしたコードに似ています。コードとそれが操作するデータには区別があります。スタックには呼び出しとローカル変数が含まれますが、実行されるコードは変更されません。

+0

どのように再帰が起こるか、その関数がローカル変数を含んでいて、これらの変数が再帰関数の入力になる場合 – Racs

+1

コードは、それが入っているものと同じ関数を呼び出し、新しいコピーを作成しません。コードをレシピと考えてください。最初にレシピを読み始めるには、新しいレシピは必要ありません。レシピを読んでいない箇所だけをメモしてください。 – yan

+0

@Raghav:あなたのコードに再帰があります。それ自身を呼び出す関数です(もちろん、終了条件があればうれしいです)。コード自体は呼び出しスタック上にはなく、そのコードがメモリ内にある場所へのポインタになります。したがって、再帰中にスタックに追加された各アイテムは、実行可能コードの同じ場所を指します。 – David

3

いいえコードを生成しません。呼び出しごとに同じコードを使用します。

詳細については、こちらをお読み

http://en.wikipedia.org/wiki/Call_stack

stackで最高点を指し、それぞれの機能のために、このポインタは、ローカル変数といくつかのシステムに必要なバイト数に増加しstack pointerがあるので、基本的に情報の割り当て。そして、関数呼び出しが終了した後に戻ります。

関連する問題