从方法返回后如何停止递归

时间:2013-03-27 22:59:15

标签: java recursion

我有一个程序可以调用一个递归的functin。

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之后完全退出函数,我不希望递归在第一次计数返回后修改调用函数中的值。

1 个答案:

答案 0 :(得分:5)

改变这个:

        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;
}