0

再帰関数を終了する方法を理解するのに苦労しています

私のコードは

    public Main()
    {
         GetFibonacci(5,20);
    }

 private void GetFibonacci(int StartNUmber, int LastNumber)
    {
        if (StartNUmber < LastNumber)
        {
            if (FibonacciRecursiveList.Count == 0 || FibonacciRecursiveList.Count == 1)
            {
                FibonacciRecursiveList.Add(StartNUmber);
            }
            else
            {
                int value = FibonacciRecursiveList[FibonacciRecursiveList.Count - 1] + FibonacciRecursiveList[FibonacciRecursiveList.Count - 2];
                FibonacciRecursiveList.Add(value);
            }
            StartNUmber++;
            GetFibonacci(StartNUmber, LastNumber);
        }
        else
        {
           return;
        }
    }

外側のelseループに到達すると、コードは引き続き実行されます

助けてください

4

6 に答える 6

3

return ステートメントに到達しても、すぐにメイン関数に戻るわけではありません。メインに戻るには、再帰呼び出しを 15 回繰り返す必要があります。

スタックを戻す際のオーバーヘッドはほとんどありません。この再帰的なアプローチは、深くなりすぎない限り問題ありません。大きな数にしたい場合は、ループとして再コーディングする必要があります。

于 2013-03-16T10:50:20.790 に答える
2

再帰呼び出しの使い方は間違っていますが、再帰呼び出しは実際には問題なく終了します。

私は、あなたが見ているものだと思います

外側のelseループに到達すると、コードは引き続き実行されます

再帰呼び出しです!コードがreturnステートメントに到達すると、メソッドはすでに 16 回呼び出されています。したがって、 return ステートメントは、メソッドが呼び出された場所、つまりブロックの最後の行に戻りifます。その後、このメソッドの呼び出しも終了するので、同じ行でたまたま 14 回目の関数の呼び出しに戻ります。これは、実行が に戻るまで、すべての呼び出しに対して続きますMain

再帰呼び出しなしで、必要なものを簡単に実装できます。

public void Main()
{
    FibonacciRecursiveList = new List<int>();
    GetFibonacci(5,20);
}


private void GetFibonacci(int StartNUmber, int LastNumber)
{
    while (StartNUmber < LastNumber)
    {
        if (FibonacciRecursiveList.Count == 0 || FibonacciRecursiveList.Count == 1)
        {
            FibonacciRecursiveList.Add(StartNUmber);
        }
        else
        {
            int value = FibonacciRecursiveList[FibonacciRecursiveList.Count - 1] + FibonacciRecursiveList[FibonacciRecursiveList.Count - 2];
            FibonacciRecursiveList.Add(value);
        }
        StartNUmber++;
    }
}
于 2013-03-16T10:52:53.283 に答える
0

外側のelseループに到達しても、コードは実行されますか?

実際の問題は、StartNUMber 値が再帰的に更新されないことだと思います。この使用のために、参照渡し

実際のコードは

 List<int> FibonacciRecursiveList = new List<int>();
    private void GetFibonacci(ref int StartNUmber, ref int LastNumber)
{
    if (StartNUmber < LastNumber)
    {
        if (FibonacciRecursiveList.Count == 0 || FibonacciRecursiveList.Count == 1)
        {
            FibonacciRecursiveList.Add(StartNUmber);
        }
        else
        {
            int value = FibonacciRecursiveList[FibonacciRecursiveList.Count - 1] + FibonacciRecursiveList[FibonacciRecursiveList.Count - 2];
            FibonacciRecursiveList.Add(value);
        }
        StartNUmber++;
        GetFibonacci(ref StartNUmber, ref LastNumber);
    }
    else
    {
       return;
    }
}

それから電話する

  int T = 1;
  int T2 = 12;
  GetFibonacci(ref  T, ref  T2);

私が正しいかどうか教えてください。

于 2013-03-16T10:56:37.087 に答える
0

戻るかGetFibbonaci、スタックがオーバーフローして aStackOverflowExceptionがスローされます。(ループはなく、再帰のみであるため、これを推測するのは簡単です。) 例外がスローされていることがわかっていない限り、例外は返されているに違いありません。

于 2013-03-16T10:47:19.803 に答える
0

上記のコードは、FibonacciRecursiveList の以下の値で問題なく動作すると思います。しかし、これが期待/意図された出力であるかどうかはわかりません。

[0] 5   int
    [1] 6   int
    [2] 11  int
    [3] 17  int
    [4] 28  int
    [5] 45  int
    [6] 73  int
    [7] 118 int
    [8] 191 int
    [9] 309 int
    [10]    500 int
    [11]    809 int
    [12]    1309    int
    [13]    2118    int
    [14]    3427    int
于 2013-03-16T10:50:14.843 に答える
0

これは私が実行するコードです:

using System;
using System.Collections.Generic;
public class Main1{
public Main1()
    {
         FibonacciRecursiveList = new List<int>();
         GetFibonacci(5,20);
    }
 private List<int> FibonacciRecursiveList;
 private void GetFibonacci(int StartNUmber, int LastNumber)
    {
        if (StartNUmber < LastNumber)
        {
            if (FibonacciRecursiveList.Count == 0 || FibonacciRecursiveList.Count == 1)
            {
                FibonacciRecursiveList.Add(StartNUmber);
            }
            else
            {
                int value = FibonacciRecursiveList[FibonacciRecursiveList.Count - 1] + FibonacciRecursiveList

[FibonacciRecursiveList.Count - 2];
                FibonacciRecursiveList.Add(value);
            }
            StartNUmber++;
            GetFibonacci(StartNUmber, LastNumber);
        }
        else
        {
           return;
        }
    }

 public static void Main(string[] args) {

     Main1 main = new Main1();
     foreach(int a in main.FibonacciRecursiveList){
         Console.WriteLine(a);
     }
 }
}

スタックオーバーフローや無限ループはありません!

出力:

5
6
11
17
28
45
73
118
191
309
500
809
1309
2118
3427
于 2013-03-16T10:53:19.947 に答える