2016-07-20 17 views
0

次の2つの同様の例は、5を下回る数値の数字を出力する再帰関数を定義します。再帰の変数への関数呼び出しの代入は、異なる出力になります。

入力:12345
出力:4 //同じ機能を持っている5


#include <stdio.h> 

int function(int n) { 
    if(!n) return 0; 

    int r = function(n/10); 

    if ((n%10) < 5) { 
     printf("%d", n%10); 
     return r+1; 
    } 
    else return r; 
} 

int main() { 
    int x; 

    scanf("%d", &x); 
    printf(" : %d\n", function(x)); 

    return 0; 
} 


第二のコードよりも小さい4桁の数字があります:1234 、しかし、私は理解できないようです。私はプログラミングに流動的ではなく、まだそれほど新しくないので、質問がはっきりと述べられることを願っています。

入力:12345
出力:4321:4


#include <stdio.h> 

int function(int n) { 
    if(!n) return 0; 

    if(n%10<5) { 
     printf("%d", n%10); 
     return function(n/10)+1; 
    } 
    return function(n/10); 
} 

int main() { 
    int x; 

    scanf("%d", &x); 
    printf(" : %d\n", function(x)); 

    return 0; 
} 
+0

2つのコードを比較する。彼らは何を違うのでしょうか?あなたの質問は出力データの順序に関連しているので、操作の順序に特に注意してください。ヒント:関数の結果を変数に代入することは、それ自体では何もしません。観察可能な振る舞いを変更することなく、2番目のコードを書き直すことも難しくありません。 –

+0

鉛筆と紙でそれを試してみてください。あなたが機能(12345)を呼び出すとどうなりますか?ケース2の場合、n%10 <5テストに失敗しますので、次に関数(1234)を呼び出します。テストに合格したので、 "4"が印刷されます。等々。 – FredK

答えて

0

call function(12345) 
> call function(1234) 
>> call function(123) 
>>> call function(12) 
>>>> call function(1) 
>>>>> call function(0) 
>>>>>> immediate return 
>>>>> print 1 
>>>> print 2 
>>> print 3 
>> print 4 
> no print 

2番目の例では順序があるので、あなたは、最初に印刷し、その関数を呼び出します。

call function(12345) 
> no print 
> call function(1234) 
>> print 4 
>> call function(123) 
>>> print 3 
>>> call function(12) 
>>>> print 2 
>>>> call function(1) 
>>>>> print 1 
>>>>> call function(0) 
>>>>>> immediate return 
0

私は再帰に対処したい場合でも、私は時々、まだの難しさを持っているint r = function(n/10);では、あなたの関数が行きます。 0にノックするまで。ノックすると、スタック構造のため、数字が1-2-3-4-5の順番になります。 (LIFOを見てください)。この順番で印刷は1-2-3-4-5印刷されます。 2番目のコードの場合、if(n%10<5)をチェックした後、最初にprintf("%d", n%10);を実行しているので、5-4-3-2-1で起動してから1234/10,123/10,....を再びノックするまで0に分割します。 IMHOでは、スタック構造がうまくいけば、再帰をよりよく理解することができます。

コールとプリントがこの順序で起こるので、あなたは、印刷前に関数を呼び出す最初の例では
関連する問題