2017-02-12 27 views
0
#include<stdio.h> 

void func1(int n) 
{ 
    if(n==0) return; 
    printf("%d",n); 
    func2(n-2); 
    printf("%d",n); 
} 

void func2(int n) 
{ 
    if(n==0) return; 
    printf("%d",n); 
    func1(++n); 
    printf("%d",n); 
} 

void main() 
{ 
    func1(5); 
} 

出力:53423122233445このCのプログラムの動作を説明してください

私は上記の出力につながる、このコードで起こっている制御の流れを理解していません。誰かが説明してくれますか?事前にありがとう:

+0

以前にプログラミングで再帰を扱ったことはありますか? –

+0

いいえ、それは何ですか? – Sunitha

+0

cで再帰をチェックしてください。あなたは別のサイトをチェックすることができます(例:Tutorialspoint) –

答えて

1

printfに注釈を付けると、プログラムのどの部分が何であるかを知ることができます。開始条件を3に変更して、全体を歩くこともできます。生成

#include <stdio.h> 

void func2(int); 

void func1(int n) 
{ 
    if(n==0) return; 
    printf("func1 before: %d\n",n); 
    func2(n-2); 
    printf("func1 after: %d\n",n); 
} 

void func2(int n) 
{ 
    if(n==0) return; 
    printf("func2 before: %d\n",n); 
    func1(++n); 
    printf("func2 after: %d\n",n); 
} 

int main() 
{ 
    func1(3); 
} 

func1 before: 3 
func2 before: 1 
func1 before: 2 
func1 after: 2 
func2 after: 2 
func1 after: 3 
  1. 関数func1(3)3を出力し、関数func2を呼び出し(1)。
  2. func2(1)は1を出力し、func1(2)を呼び出します。
  3. func1(2)は2つの呼び出しfunc2(0)を出力します。
  4. func2(0)はすぐに戻ります。

ここで、再帰の最下点に達しました。この時点で、関数呼び出しのスタックを構築しました。

  1. 関数func1(3)
  2. 関数func2(1)
  3. 関数func1(2)

関数func2一旦それが中断した場所(0)戻り、関数func1の呼び出し(2)ピックアップ私たちはスタックを底から上に向かって作業します。

  1. func1(2)は2を出力し、func2(1)に戻ります。
  2. func2(1)はnをインクリメントしてfunc1(3)に戻るため、2を出力します。
  3. func1(3)は3を出力し、main()に戻ります。
  4. main()が戻り、プログラムが終了します。プロセス、それはステップバイステップで、と呼び出されるものを書き留めて - 私は再帰がローカル変数でどのように機能するかを教える生徒を通じて発見した
2

はそれを理解する最も簡単な方法は、あなたがコンピュータがまったく同じものを行う場合、 であるということです変数の値は、例えば

を変更する場合、および:

main 
    func1(5) 
    n=5 
    printf 5 
    func2(5-2) 
     n=3 
     print 3 
     ++n 
     n=4 
     func1(4) 
     n=4 
     print 4 
     func2(4-2) 
      n=2 
      print 2 
      ++n 
      n=3 
      func1(3) 
      n=3 
      print 3 
      func2(3-2) 
       n=1 
       print 1 
       ++n 
       n=2 
       func1(2) 
       n=2 
       print 2 
       func2(2-2) 
        n=0 
        if n==0 => return 
       print 2 
       print 2 
      print 3 
      print 3 
     print 4 
     print 4 
    print 5 
    //done 

また、各関数呼び出しの中に、 は、関数内の「n」への変更は、変更しないことを理解する必要があります早くそれが呼び出された場所からの値。 すべての関数呼び出しでスタックに新しい変数セットが作成され、 関数が返ってくると、変数はスタックから削除されます。

stack: (empty) 

main 
    func1(5) ==> push n='5' on stack, then jump to func1() 
    stack is now { n=5 } 
    so n is 5 
    print 5 
    func2(5-2) ==> push 'n=3' on stack, then jump to func2() 
     stack is now { n=3 } , { n=5 } 
     so n is 3 
     print 3 
     ++n 
     stack is now { n=4 } , { n=5 } 
     func1(4) ==> push 'n=4' on stack then jump to func1() 
     stack is now { n=4} , { n=4 } , { n=5 } 
     so n is 4 
     print 4 
     func2(4-2) ==> push 'n=2' on stack then jump to func() 
      stack is now {n=2}, {n=4} , { n=4 } , { n=5 } 
      ++n 
      stack is now {n=3}, {n=4} , { n=4 } , { n=5 } 
      ...etc... 
      ..... 
      .... 
      stack is eventually {n=0} {n=2}, {n=2}, {n=2} ,{n=1} {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 } 
      after func(2-2) is called 
      then: 
       if n==0 => return; 
      the return pops one item {n=0} off the stack, so 
      stack is then {n=2}, {n=2}, {n=2} ,{n=1} {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 } 
      print 2 
      return (deletes {n=2}) 
      stack is then {n=2}, {n=2} ,{n=1} {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 } 
      print 2 
     return (deletes {n=2}) 
     stack is then {n=2} ,{n=1} {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 } 
     print 2 
     return (deletes {n=2}) 
    stack is then {n=1} {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 } 
    print 1 
    return (deletes {n=1}) 
    stack is then {n=3}, {n=3}, {n=4} , { n=4 } , { n=5 } 
    print 3 

などが終了し、最後の '5'が出力されるまで続きます。

関連する問題