如何退出这个递归循环

本文关键字:递归 循环 退出 何退出 | 更新日期: 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);