Java 递归中的计数深度

Java 递归中的计数深度,java,Java,我们有一些关于输入的链接:“http://test.com“此链接有以下链接:”http://test.com", "http://test.com/some", "http://google.com“和”http://test.com/some“有链接:”http://facebook.com“,”some.com“ 所需的结果是:到主:0链接的步骤:http://test.com“ExtLinkScont:1 主:1链接的步骤:http://test.com/some“ExtLinkScon

我们有一些关于输入的链接:
“http://test.com“此链接有以下链接:
”http://test.com", "http://test.com/some", "http://google.com“
和”http://test.com/some“有链接:”http://facebook.com“,”some.com“

所需的结果是:
到主:0链接的步骤:http://test.com“ExtLinkScont:1

主:1链接的步骤:http://test.com/some“ExtLinkScont:2

我计算了extlinks,但我不知道如何计算递归中的步长

public void info(String url) throws IOException {

        if (!parsedLinks.contains(url)) {

            parsedLinks.add(url);
            String[] links =  hp.getLinks(url);
            System.out.println("Link : " + url + "\n"
                              +"ExtLinksCount : " + externalLinksCount(links) + "\n"
                              +"Steps to main : " + step
                              );
            String strippedLink;

            for (int i = 0; i < links.length; i++) {

                strippedLink = LinkParser.parseLink(links[i]);

                if ( strippedLink.contains(this.baseUrl) ) {
                    ++ step; 
                    info(links[i]);
                }


            }
        }

    }
公共无效信息(字符串url)引发IOException{
如果(!parsedLinks.contains(url)){
添加(url);
String[]links=hp.getLinks(url);
System.out.println(“链接:+url+”\n”
+ExtLinkScont:“+ExternalLinkScont(链接)+”\n
+“主步骤:”+步骤
);
串带链路;
for(int i=0;i
在构造函数中添加一个变量“step”怎么样。您已经有了增加它的代码。

如果您想确定从“主”URL开始到达某个URL所需的步骤数,跟踪深度并不总能得到所需的结果,因为递归实现的行为类似于深度优先搜索

考虑以下图表:
A->[B,C];B->[C]
。调用
info(A)
您将迭代到B和C的链接。首先,您调用
info(B)
,将距离(A,B)设置为1。现在,通过调用
info(B)
,您可以调用
info(C)
,将距离(A,C)设置为2
info(C)
info(B)
返回,您再次从
info(A)
调用
info(C)
,但此调用立即返回,而不会将距离(A,C)更新为1,因为C已经在解析链接集中

使用递归,您可以尝试以下操作(伪代码):

其中,
visted
是一个映射,将URL映射到它们与主URL的距离,并进行初始化,以便
visted[main]=0
。但是,这仍然会多次访问某些链接,因此使用广度优先搜索更有效:

info(main):
    visited = map{main: 0}
    queue = queue(main)
    while queue not empty:
        url = queue.pop()
        for link in links(url):
            if link not in visited:
                visited[link] = visited[url] + 1
                queue.append(link)

我在constructor中已经有了这个变量。但是它不计算深度,因为它只在递归的一个分支上工作。我不知道如何在递归的所有分支上计算深度recursion@incredible_titan我认为@hatcyl的意思是使
step
成为方法的一个参数,并在每次递归调用中增加它:
publicsvoidinfo(stringurl,int-step){[…]info(link,step+1);[…]}
。如果
步骤
是在
信息
之外定义的,它将计算累积步骤。但是请注意,虽然它可以准确地测量递归的深度,但它不一定能让您达到达到某个URL的最低步数。
info(main):
    visited = map{main: 0}
    queue = queue(main)
    while queue not empty:
        url = queue.pop()
        for link in links(url):
            if link not in visited:
                visited[link] = visited[url] + 1
                queue.append(link)