当前位置: 首页 > 知识库问答 >
问题:

C#递归步长法

胡国兴
2023-03-14

假设我们有以下数组,并且开始索引==0:

int[] arr = {3, 6, 4, 1, 3, 4, 2, 5, 3, 0};

步骤0:索引=0,值=3

步骤1:索引=3,值=1

步骤5:索引=6,值=2

步骤6:索引=8,值=3

步骤7:索引=5,值=4

        static bool Solveable(int index, int[] arr)
        {
            if (arr[index] == 0)
                return true;
            if (index + arr[index] < arr.Length)
                return Solveable(index + arr[index], arr);
            if (index - arr[index] >= 0)
                return Solveable(index - arr[index], arr);

            return false;
        }

共有1个答案

韦衡
2023-03-14

对于无法解决的情况,您对堆栈溢出的看法是正确的:递归代码的行为就像一只狗在追逐自己的尾巴,直到它达到堆栈限制。

幸运的是,您可以通过观察到最多有n步骤到达数组的末尾来打破这种无限递归,如果您要到达数组的末尾的话。因此,您可以添加第三个参数来指示您已经执行了多少步骤。如果在步骤数通过n之前达到零,则有一个路径;否则,你就没有路径。

static bool Solveable(int index, int[] arr, int stepsSoFar) {
    if (arr[index] == 0)
        return true;
    if (stepsSoFar > arr.Length)
        return false;
    ...
    // The rest of your code; pass stepsSoFar+1 down to the next level
}

我只能使用代码段中包含的两个参数

static bool Solveable(int index, int[] arr) {
    if (arr[index] == 0)
        return true;
    if (arr[index] == -1)
        return false;
    int oldArrAtIndex = arr[index];
    arr[index] = -1;
    try {
        ...
        // The rest of your code
    } finally {
        arr[index] = oldArrAtIndex;
    }
}
 类似资料:
  • 本文向大家介绍C#递归算法之归并排序,包括了C#递归算法之归并排序的使用技巧和注意事项,需要的朋友参考一下 归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并半子表 首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,

  • 问题内容: 请分步说明递归; 问题答案: 如果您使用的是IDE,则可以使用调试器,亲眼看看发生了什么。 无论如何,让我们尝试一下,当调用递归方法时会发生什么:您使用8()调用该方法: -> 8 ->以8/2 = 4再次调用方法 -> 4 >以4/2 = 2再次调用方法 -> 2 >用2/2 = 1再次调用方法 ->继续上一个通话,() >用2/2 = 1再次调用方法 ->继续上一个通话,() 方法

  • 问题内容: 我有一个异步函数,要连续多次调用。问题是“多个”可以是几十万或数百万… 显而易见的方法是从回调中调用相同的函数,如下所示: 当然,涉及一些逻辑来停止递归。问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 问题答案: 问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 否。 如果调用回调是异步传递的,则不会堆积堆栈。 在您的代码中: 这是逐步发生的事情: 首先被称为。 然后

  • 以下是我尝试过的,但在某些情况下失败了,但我觉得我几乎走上了正确的轨道。

  • 我对函数式编程很陌生,尤其是下面使用的Scheme。我正在尝试使以下函数是递归的,尾递归的。基本上,该函数的作用是对两个字符串的对齐方式进行评分。当给定两个字符串作为输入时,它会比较每个“列”字符,并根据在称为 scorer 的函数中实现的评分方案(由下面的代码中的函数调用)来累积该对齐的分数。 我有一个想法,用一个帮助函数来累积分数,但我不太确定如何去做,因此我该如何让下面的函数尾递归呢?

  • 问题内容: 假设具有以下CTE,这些CTE返回我已经拥有的某些树数据(邻接模型)的级别(取自Linq中的分层数据- options和performance): 我想知道通过使用C#而不是SQL进行递归是否会提高性能。假设我有一个IQueryable,其中Tree是表示层次结构表中条目的实体,谁能向我展示如何执行CTE与递归C#函数相同的工作?类似于以下内容: 看到使用lambda表达式很容易做到这