1

我有一个调用递归函数的程序。

int dd=dis(root,2,0);

功能码

   public int dis(Node n,int g,int count)
   {
    if(g==n.data)
    {
        System.out.println("equal count"+count);
        return count;
    }
    
    else if(g>n.data)
    {
        count=count+1;
        dis(n.right,g,count);
    }
    
    else if(g<n.data)
    {   
        count=count+1;
        dis(n.left,g,count);
    }
    System.out.println("function"+count);
    return count;
}

当数据等于节点值时,函数返回计数,即我需要的确切值。但是在count返回后继续递归,在函数结束时返回异常的count值。

在从 == 案例返回 count 后,我​​想完全退出函数,我不希望在返回第一个 count 后递归修改调用函数中的值。

4

1 回答 1

7

改变这个:

        dis(n.right,g,count);

对此:

        return dis(n.right,g,count);

还有这个:

        dis(n.left,g,count);

对此:

        return dis(n.left,g,count);

编辑添加:编写此函数的更简单方法可能是:

public int dis(final Node n, final int g)
{
    if(g == n.data)
        return 0;
    else
        return 1 + dis(g < n.data ? n.left : n.right, g);
}

请注意,在这种方法中,count变量完全消失了:从命令/过程的角度来看,您可能会说,这种方法不是在您下降到树中时计算节点,而是在返回时计算它们。(但最好从函数/递归的角度来看它,并说如果g适当的子树中n的深度是 ,那么它在父树中的深度更大。)

最简单的命令式版本可能是:

public int dis(final Node root, final int g)
{
    int depth = 0;
    for(Node n = root; g != n.data; n = (g < n.data ? n.left : n.right))
        ++depth;
    return depth;
}
于 2013-03-27T23:02:58.120 回答