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

到达结束递归方法的最小跳数

白烨煜
2023-03-14

我有一个关于递归的小问题。下面的代码实际上是问题的答案到达终点的最小跳跃次数

// C program to find Minimum
// number of jumps to reach end
#include <limits.h>
#include <stdio.h>

// Returns minimum number of
// jumps to reach arr[h] from arr[l]
int minJumps(int arr[], int l, int h)
{
    // Base case: when source and destination are same
    if (h == l)
        return 0;

    // When nothing is reachable from the given source
    if (arr[l] == 0)
        return INT_MAX;

    // Traverse through all the points
    // reachable from arr[l]. Recursively
    // get the minimum number of jumps
    // needed to reach arr[h] from these
    // reachable points.
    int min = INT_MAX;
    for (int i = l + 1; i <= h && i <= l + arr[l]; i++) {
        int jumps = minJumps(arr, i, h);
        if (jumps != INT_MAX && jumps + 1 < min)
            min = jumps + 1;
    }

    return min;
}

// Driver program to test above function
int main()
{
    int arr[] = { 1, 3, 6, 3, 2, 3, 6, 8, 9, 5 };
    int n = sizeof(arr) / sizeof(arr[0]);
    printf(
        "Minimum number of jumps to reach end is %d ",
        minJumps(arr, 0, n - 1));
    return 0;
}

当h==l和arr[l]==0时,函数返回sth,函数结束。否则,它将更新一个称为跳跃的变量,但我无法理解该语句。例如,当i=1或i=2时,跳跃的值是多少,依此类推。换句话说,我无法理解变量更新过程的意义。

共有1个答案

艾灿
2023-03-14

也许关键是仔细阅读和理解函数的定义:

// Returns minimum number of
// jumps to reach arr[h] from arr[l]
int minJumps(int arr[], int l, int h)

这很清楚。

实现递归函数时的任务是将问题分解为一个或多个基本情况,以及通过递归调用解决一个或多个较小问题的递归步骤,然后使用结果解决整个问题。

这里的基本情况是在同一位置开始和结束。不需要任何步骤。返回0。

(作者还将零数组元素视为特例。那是不必要的。如果这些行被删除,程序将同样工作。)

递归步骤实现了这一思想:

要从lh,首先从li迈出一步,然后(递归)计算出从ih的最小步数S。因此,步骤总数为s1。

i选择什么?找到最少步数的唯一方法是考虑所有的可能性并取最小值。这些可能性是<代码> L 1 < /代码>通过<代码> h <代码>,即一开始的长度为1的初始步骤,在一步内将整个间隙从<代码> L<代码>代码> <代码> h >代码(因此第二步长度为零)。

 类似资料:
  • 我有一个“使用递归到达数组末尾的最小跳跃次数”的代码。但我无法打印序列。(vector vec中没有可打印的内容) 如有任何帮助,将不胜感激。 说明: 我想以最小跳跃从数组的第一个元素(即2)到达最后一个元素(即4) 跳转的方式: 第一个元素是2。这意味着我最多可以在阵列中进行2次跳跃。如果我跳第一步,那么我可以跳到第二个元素(即3),或者如果我跳第二步,那么我可以跳到第三个元素(即1) 第二个元

  • 问题声明:给定数组:[1,0,1,0,1,1,1,1,1,0,1,1,1,0]输出:到达结束所需的最小步骤 条件: 0上的步骤是退出 我已经完成了不使用DP的情况下的使用,是否存在针对此问题的DP解决方案。 我的代码:

  • 在Geeks for Geeks中分析了以下问题: 给定一个整数数组,其中每个元素表示可以从该元素向前执行的最大步数。编写一个函数,返回到达数组末尾(从第一个元素开始)的最小跳转次数。如果元素为0,则它们无法通过该元素。如果无法到达endpoint,则返回-1。 这个问题的递归解决方案是递归当前元素的每一个可能的步骤,并返回最小跳跃。因此,如果数组的大小是,那么对于第一个元素,我们有步骤(选择)递

  • 本文向大家介绍php递归删除指定文件夹的方法小结,包括了php递归删除指定文件夹的方法小结的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了两种php递归删除指定文件夹的方法。分享给大家供大家参考。具体如下: 方法一: 方法二: 希望本文所述对大家的php程序设计有所帮助。

  • 问题内容: 背景:我正在使用最小构造算法构建一个Trie以表示字典。输入列表是430万个utf-8字符串,按字典顺序排序。生成的图是非循环的,最大深度为638个节点。我的脚本的第一行通过将递归限制设置为1100 。 问题:我希望能够将Trie序列化到磁盘上,因此我可以将其加载到内存中,而不必从头开始重建(大约22分钟)。我已经尝试了和,同时使用了文本和二进制协议。每次,我都会得到如下所示的堆栈跟踪

  • 我的java代码中有一些错误。。我试图通过递归找到最小值。。我在上一个索引中的错误。。我注意到,如果上一个索引中的最小数字出现错误消息“java.lang.ArrayIndexOutOfBoundsException:8”。否则,如果最小值不在最后一个索引中,它将返回数组中找到的第一个最小值,并且从不检查其他值。 这是我的代码: 输出 数组中找到的第一个最小数的图像 最后一个索引中最小数字的图像