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 语句时,它不会立即返回到 main 函数。它必须通过递归调用返回 15 次才能回到 main。

返回堆栈的开销很小。只要不深入,这种递归方法就可以了。如果你想增加一个很大的数字,那么你必须将它重新编码为一个循环。

于 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

要么GetFibbonaci返回,要么堆栈溢出并StackOverflowException抛出 a 。(推断这一点很简单,因为没有循环,只有递归。)除非您知道正在抛出异常,否则它必须返回。

于 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);
     }
 }
}

没有stackoverflow或无限循环!

输出:

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

在到达外部 else 循环时,代码仍然运行吗?

我认为实际问题是 StartNUMber 值没有递归更新 BACK ,为此使用通过引用传递

真正的代码变成

 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 回答