递归嵌套循环

时间:2009-11-07 21:21:51

标签: ruby

示例场景:注意,根据网站的不同,这可以是深度还是浅度。 Spider扫描第一页以获取链接。它将其存储为 array1。

蜘蛛进入第一个链接,它现在在第二页。它会看到链接,并将其存储为 array2。

spider进入第二页的第一个链接,现在是第三页。 它会看到链接,并将其存储为数组3。

请注意,这是一般情况。我想强调需要在循环中做很多循环。

rootArray [ARRAY1,数组2,ARRAY3 ....]

我怎么能做一个递归的嵌套循环? array2是array1的每个VALUE的子节点(我们假设结构非常统一,数组1的每个VALUE在array2中都有类似的链接)。数组3是array2的每个Value的子元素。等等。

4 个答案:

答案 0 :(得分:2)

module Scratch
  def self.recur(arr, depth, &fn)
    arr.each do |a| 
      a.is_a?(Array) ?  recur(a, depth+1, &fn) : fn.call(a, depth)
    end
  end
  arr = [[1, 2, 3], 4, 5, [6, 7, [8, 9]]]
  recur(arr, 0) { |x,d| puts "#{d}: #{x}" }
end

答案 1 :(得分:1)

您希望将这些结果存储在树中,而不是数组的集合中。 Page1将为每个链接提供子节点。其中每个都有链接等的子节点。另一种方法是将所有链接存储在一个数组中,通过网站递归以查找相关链接。你真的需要它们的结构类似于网站吗?

在将任何新链接添加到列表/树/您已经获得的任何内容时,您还需要检查重复链接。否则,循环如page_1 - > page_2 - > page_1 ...会破坏你的应用。

你的真正目标是什么?页面抓取工具并不是新技术。

答案 2 :(得分:1)

这一切都取决于你想要做什么。

如果您正在收集链接,那么散列或集合将很好用。也可以使用数组,但可能导致一些陷阱。

如果您需要显示网站的结构,您需要一个树或数组数组,以及标记您访问过的网址的某种方式。

在任何情况下,您都需要避免冗余链接以防止进入循环。对你下降的深度以及你是否会记住和/或关注网站之外的链接也存在某种限制也是很常见的。

答案 3 :(得分:0)

Gweg,我刚刚在你的另一篇文章中回答了这个问题。

How do I create nested FOR loops with varying depths, for a varying number of arrays?