gpt4 book ai didi

Ruby:递归混淆

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:43 25 4
gpt4 key购买 nike

我正在阅读某人使用 ruby​​ 构建域爬虫方法的代码。我是递归概念的新手,无法理解如何阅读他们的代码。

代码:

def crawl_domain(url, page_limit = 100)
return if @already_visited.size == page_limit # [1]
url_object = open_url(url)
return if url_object == nil # [2]
parsed_url = parse_url(url_object)
return if parsed_url == nil # [3]
@already_visited[url]=true if @already_visited[url] == nil
page_urls = find_urls_on_page(parsed_url, url)
page_urls.each do |page_url|
if urls_on_same_domain?(url, page_url) and @already_visited[page_url] == nil
crawl_domain(page_url)
end
end
end

问题:

  1. 连续return的组合是什么报表是什么意思?
  2. 在第 [1] 行,如果 @already_visited 的大小与 page_limit 相同,程序是否会跳出 crawl_domain 方法并跳过其余代码?
  3. 如果@already_visited 的大小与page_limit 相同,它是否在设置url_object = open_url(url) 后继续到下一个返回语句?

提前感谢您的帮助!

来源: http://www.skorks.com/2009/07/how-to-write-a-web-crawler-in-ruby/

最佳答案

忘掉网络爬虫吧。考虑如何使用递归来添加构成数组的数字:

arr = [1, 2, 3, 4]
def sum(array)
# ??
end
puts sum(arr) #=> 10, please

假装问题已经解决了。 (所有递归都依赖于假装这个。)然后 sum([1, 2, 3, 4])1 + sum([2, 3, 4]),通常,任何数组的 sum 都是第一个元素加上数组其余部分的 sum。在 ruby​​ 中,将数组拆分为首尾的方法是 shift;调用 shift 返回数组的第一个元素, 将它从数组中移除。所以我们可以这样写:

arr = [1, 2, 3, 4]
def sum(array)
return array.shift + sum(array)
end
puts sum(arr)

看,一个递归的解决方案!然而,有一个问题:我们永远递归(或者,至少,直到遇到某种错误)。在所有递归中,在退化情况递归之前放置某种“停止”是至关重要的。在我们的情况下,那个退化的案例是什么?这是数组为空的时候! (最终会是这样,因为每个 sum 调用都会从数组中删除一个元素。)对于空数组,显然 sum 为零。所以:

arr = [1, 2, 3, 4]
def sum(array)
return 0 unless array.length > 0
return array.shift + sum(array)
end
puts sum(arr)

结束。

您的网络爬虫类似。我们将递归抓取当前页面的每个子级别,但首先我们有一些“停止”(return 语句)以防止在各种退化情况下陷入错误情况。 (在网络爬虫的情况下,不需要检查当前页面是否确实有 子级别,因为如果没有,each 将不执行任何操作并且我们不会递归。)

关于Ruby:递归混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15737220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com