2013-03-16 102 views
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; 
     } 
    } 

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

请帮

+0

你是否在代码上设置了一个断点来验证'return'语句是否真的被达到了?我怀疑编译器是否被破坏,并继续循环,即使代码说不。 – 2013-03-16 10:43:06

+0

是的,我已经做到了 – Rohit 2013-03-16 10:43:57

+0

为什么要递归地调用函数?用一个包含以前值的列表('FibonacciRecursiveList'),你实际上不需要递归调用。 – 2013-03-16 10:47:01

回答

3

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

返回堆栈的开销很小。只要不会太深,这种递归方法就没有问题。如果你想要达到一个很大的数目,那么你将不得不将它重新编码为一个循环。

+0

我想多数民众赞成我的解决方案......但是我失去了什么..如何我可以避免它? – Rohit 2013-03-16 10:51:52

+0

你不想避免它。所有递归算法都以这种方式工作。 – SteveP 2013-03-16 10:53:52

+0

@Kyle:这就是递归函数的工作原理。 如果你不想要它,你可以尝试使用While循环和break来重写你的逻辑/函数;而不是递归。 – 2013-03-16 10:54:37

0

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

0

我觉得你在FibonacciRecursiveList的下面的值上面的代码运行OK。 但是,不知道这是否是预期的/预期的输出。

[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 
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++; 
    } 
} 
+0

谢谢MD这是非常翔实的 – Rohit 2013-03-16 11:05:53

+0

@Kyle不客气。 – 2013-03-16 11:08:38

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 
0

在到达外其他循环的代码仍然运行?

我认为实际的问题是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); 

设我知道我是否正确?