如何退出此递归循环?

时间:2013-03-16 10:39:16

标签: c# visual-studio-2010 algorithm fibonacci

我很难搞清楚如何退出递归函数

我的代码是

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

在到达Outer else循环时,代码仍然运行

请帮忙

6 个答案:

答案 0 :(得分:3)

当它到达return语句时,它不会立即返回到main函数。它必须通过递归调用返回15次才能返回main。

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

答案 1 :(得分:2)

您对递归调用的使用是错误的,但是,您的递归调用确实没有问题。

我想,你看到的是什么

  

在到达外部的其他循环时,代码仍然运行

是递归调用!当代码到达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++;
    }
}

答案 2 :(得分:0)

GetFibbonaci返回或堆栈溢出并抛出StackOverflowException。 (推导它是微不足道的,因为没有循环,只有递归。)除非你知道抛出异常,否则它必须返回。

答案 3 :(得分:0)

我觉得上面的代码在Fibonacci递归列表中使用以下值运行正常。 但是,不确定这是否是预期/预期的输出。

[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

答案 4 :(得分: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

答案 5 :(得分:0)

  

在到达Outer 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);

让我知道我是否正确?