我很难搞清楚如何退出递归函数
我的代码是
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循环时,代码仍然运行
请帮忙
答案 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);
让我知道我是否正确?