0

コード設計 1: 完全に動作します

 public static void main (String[] args)
    {       
        recursion(2);       
    }

    public static void recursion(int num)
    {
        if (num > 0)
        {
            recursion( num - 1 );
            System.out.println(num);
        }   
    }

コード デザイン 2 : 無限ループ。?

public static void main (String[] args)
    {       
        recursion(2);       
    }

    public static void recursion(int num)
    {
        if (num == 0) return;
        while (num > 0)
        {
            recursion( num - 1 );
            System.out.println(num);
        }   
    }
  1. 2番目のデザインが無限ループに陥る理由を理解するのを手伝ってくれる人はいますか?
  2. 私はすでに2番目のデザインにリターンを入れています。それでうまくいくはずだった。また、詳しく説明していただけますか?
4

8 に答える 8

3

1.まず、ループでifはありません。ループ、forループ、ループのみがあります。for-eachwhiledo-while

2.無限ループに入る 2 番目のコードの理由は、の値を決して減分しないためです num

これを行う....

while (num > 0)
    {
        recursion( num - 1 );
        System.out.println(num);
        num = num - 1;           // Decrementing the value of num by 1
    }  
于 2012-08-07T06:25:28.163 に答える
1

while ループに入ると、num は 0 よりも大きく、その値は変更されません。

于 2012-08-07T06:21:36.530 に答える
0

valueは、メソッドnumに渡された後は変更されません。recursion

    if (num == 0) return;
    while (num > 0)
    {
        recursion( num - 1 );
        System.out.println(num);
        num--;                   // add this line.
    }   
于 2012-08-07T06:23:07.257 に答える
0

num の値はループ内で変化しません。そのため、ループし続けます。

于 2012-08-07T06:23:27.597 に答える
0
   while (num > 0)
            {
                recursion( num - 1 );
                System.out.println(num);
            } 

while ループでは、 num に 2 を渡しています。2 は常に 0 より大きいため、無限ループに入ります。

無限ループを避けるために、num 変数の値を変更しました。

 while (num > 0)
            {
                recursion( num - 1 );
                System.out.println(num);
                num--;
            } 
于 2012-08-07T06:26:32.327 に答える
0

ループまたは再帰を使用するかどうか、両方を同時に使用しないでください。

一般に、ループを使用して目的のアクションを実行できる場合、ループを使用する方が高速でオーバーヘッドが少ないため、再帰を考慮する必要はありません。

質問に戻ります:
1. 無限ループは避けられません。ループのようにnum減少していません。2.もちろんリターンはありますが、とで
入力した場合からではありません。 ここで何が起こるかを示します: with を入力します。で呼び出します。そこには無限ループがあり、もちろん無限に戻ります。しかし、元に戻ることはありません。recursionnum = 2num = 1
recursionnum = 2recursionnum = 1recursion(2)

于 2012-08-07T06:32:54.740 に答える
-2

その理由は、num が呼び出しの参照としてではなく、値によってコピーされるためです。recursion( num - 1 );

編集:ええ、人々は喜んで反対票を投じますよね?確かに、参照対値によるコピーは正しい答えではありませんでしたが、彼のコード例を最初に読んだとき、その特定の問題を誤解しているように見えました。私は訂正します。

于 2012-08-07T06:22:45.247 に答える
-2

なぜそのような機能を実行するためにこれをすべて経験しているのかわかりませんか? あなたの質問を受け取っていない場合は申し訳ありませんが、ここに私が提案する良いコードがあります..

public static void main(String[] args){
    countdown(10);
}

public void countdown(int num){

    for(int i = num; i >= 0; i--){
        System.out.println(num);
    }
}
于 2012-08-07T06:24:37.583 に答える