2017-11-02 4 views
0
void fun(struct node* start) 
{ 
    if(start == NULL) 
     return;     // LINE 1 
    printf("%d ", start->data); 

    if(start->next != NULL) 
     fun(start->next->next); 
    printf("%d ", start->data); 
} 

このステートメントはどのように機能しますか?私は働いていない!以下のスケルトンコードでLINE1を理解できませんでした

質問がされた:

リンクリストを次の最初のノードを指す開始する機能を次の出力は何ですか? 1-> 2-> 3-> 4-> 5-> 6

+1

あなたはそれについてどうなっていませんか? – Steve

+1

これは呼び出し側にtotを返します。それはあなたのC教科書で見つけることができる基本的な知識です。 –

+0

returnは関数からの出口点を示す単なる方法です。 関数return-typeの値を返す必要があります。この場合、voidは何もありません。 'return'は関数を何も返しません。 'else'ステートメントにすべてのものを置くのと同じことです。 – immortal

答えて

2

returnステートメントはすぐに機能を終了します。 startNULLの場合、この関数は何も行いません。関数が常に本体の終わりに達することが望ましい場合、関数は次のように書き直すことができます。出力に関しては

void fun(struct node* start) 
{ 
    if(start != NULL) 
    { 
     printf("%d ", start->data); 

     if(start->next != NULL) 
      fun(start->next->next); 
     printf("%d ", start->data); 
    } 
} 

start->dataの内容、すなわち初めと機能の体の終わりに、二回を印刷していることに注意してください。

もっと正確には、次の入力を考えてみましょう。

1->2->3->4->5->6 

端と先頭との間に 次の再帰呼び出しの結果で最初の呼び出し印刷1。改行は、読みやすくするためのものです。

途中で通話を拡大
1 
[output for the list 3->4->5->6] 
1 

は、同じ引数を使用して、次のような出力が得られます。

1 
3 
[output for the list 5->6] 
3 
1 

ここでも、再帰呼び出しを拡大することができます。

1 
3 
5 
[output for an empty list] 
5 
3 
1 

空のリストの出力も空であるため、全体の出力は次のようになります。

1 
3 
5 
5 
3 
1 
+0

私はこの質問の出力を得られません。私の理解によると、それは印刷されるべきです(1,3,5)。しかし、出力は(1,3,5,5,3,1)です。 –

-1

具体的には、あなたは、再帰関数のベースケースを見ています。再帰関数には一般的に2つの枝があります。

1)関数が単純に(値はしばしばではなく)返すベースケース(または基本ケースのセット)。 2)再帰的ケース。ベースに関数自体への1つ以上の再帰呼び出しが含まれている場合に実行されます。

上記の関数では、基本ケースは(start == NULL)です。再帰的なケースはfun(start->next->next);となります。

関連する問題