如何退出这个递归循环
本文关键字:递归 循环 退出 何退出 | 更新日期: 2023-09-27 18:04:06
我很难弄清楚如何退出我的递归函数
My Code is
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循环时,代码仍然运行
请帮
当它到达return语句时,它不会立即返回到主函数。它必须通过15次递归调用返回到main。
返回堆栈的开销很小。只要不太深入,这种递归方法是可以的。如果你想达到一个较大的数字,那么你必须将它重新编码为一个循环。
你对递归调用的使用是错误的,然而,你的递归调用确实没有问题。
我猜,你看到的是
到达外部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++;
}
}
GetFibbonaci
返回或堆栈溢出并抛出StackOverflowException
。(推导这个很简单,因为没有循环,只有递归。)除非您知道正在抛出异常,否则它必须返回。
我觉得上面的代码在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
这是我运行的代码:
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
到达外部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);