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

Ruby递归DFS方法

张丁雷
2023-03-14

我在深度优先搜索算法实现的递归方法方面遇到了一些麻烦。这是二叉树照片:

该方法在树的右侧(55、89、144)工作得很好,但是当它来到左侧时,它返回nil,即使它输入“是”。那么,代码有什么问题呢?节点是Node类的一个实例,它具有值(整数)并链接到左右子级(Node类的其他实例),如果它没有来自该侧的子级,则为nil。

下面是方法代码:

def depth_first_search(node, target)
    if node.value == target
        puts "yes"
        return node
    end
    depth_first_search(node.child_left, target) if node.child_left
    depth_first_search(node.child_right, target) if node.child_right
end

共有1个答案

隆飞宇
2023-03-14

因为depth_first_search(node.child_left,target)不是方法的最后一行,所以它的值永远不会返回。如果其值不是<code>nil</code>,则需要返回其值。下面是一个解决问题的方法示例:

def depth_first_search(node, target)
    if node.value == target
        puts "yes"
        return node
    end
    left = depth_first_search(node.child_left, target) if node.child_left
    right = depth_first_search(node.child_right, target) if node.child_right
    left or right
end

请注意,即使在左子树上找到正确的节点,此示例也将搜索右子树,这是低效的。

 类似资料:
  • 我正在做运动,我有点困了,需要一些帮助。假设有向图上有以下顶点和边:AB、BC、AD、CD、DC、DE、CE、EB、AE,如下所示 到目前为止,我已经设法通过使用DFS和递归来解决这个问题。我跟踪深度(即距离源有多少边),当深度超过3时,递归函数返回。 我现在想做的是不使用递归来解决它,也就是说,使用堆栈,但我卡住了!如果我使用以下类似的东西(伪代码): 那么我就无法知道每个顶点应该在哪个深度。我

  • 这个问题不是为作业做的,尽管它是一个典型的“类似作业”的问题,我试图用不同的方法来解决。 我想写一个方法,它将使用深度优先搜索算法递归地遍历二叉树,以找到字符的匹配。一旦它找到匹配的字符,我希望它返回一个字符串,该字符串使用0和1映射该字符在树中的位置。例如,“001”将指示通过到根节点的左节点、该节点的左节点,然后到该节点的右节点来找到字符。 下面是我目前拥有的代码: 该方法最初被发送要搜索的字

  • 我试图使用DFS解决一个图形问题,但遇到了一堵墙。这是我在Python3中的实现。unvisited是一个整数数组,start和end是unvisited中的整数,path是一个空数组,在DFS运行时填充,edges是一个边字典。 目标是找到一条从开始到结束访问unvisted中所有int的路径。因此,我遇到了递归的问题(我认为),因为在路径错误的情况下,我不想返回任何东西;相反,我希望DFS继续

  • 我有两个非递归方法,其中一个读取字符串中的总“e”字符,另一个检查 ArrayList 是否按字母顺序排列。 递归方法的定义是方法调用自身。我相信我理解这个概念,但要实现它或将其转换为递归方法确实很困难。我怎样才能将这些方法转化为递归方法,同时我应该如何思考?此外,这是我的另一种方法,它只打印出指定数字大小的数字。 条件方法检查数字的第一个数字(从右起)是否大于第二个数字,并再次检查第二个是否大于

  • 我正在处理我当前的任务,即创建一个LinkedList数据结构,我已经创建了它以及其他方法,它工作得非常好。我正在处理我的最后一个问题,即制作一个toString方法。它应该: toString方法返回列表的字符串表示形式。用逗号分隔每个项目,并用大括号括住这些项目,例如{1,4,7,5}。公共toString方法必须调用私有递归方法来生成以逗号分隔的项目列表。(但您可以在公共方法中添加大括号。)

  • 我正在研究一个简单的递归方法,在Ruby中实现Euclid的算法,并发现自己在弄清楚一旦达到基本情况后如何返回所需的值。以下是我必须了解的内容: 并且输出: 注意,“puts euclid_alg(100,15)”没有输出,我希望返回100和15,5的最大公约数。 为了进行故障排除,我将第3行中的替换为。新的产出是: 将“make it here 5 10”添加到控制台输出中,可以清楚地表明 re