在递归方法中返回错误的计数

时间:2013-10-29 23:41:59

标签: java recursion linked-list

尝试递归搜索时,我没有返回正确的数字。我使用它来遍历用单链表实现的队列并返回该项所在的索引,这样我就可以确定我需要多少次dequeue()来获取该项。

public int search(E item) {
    return recSearch(item, head);
}

public int recSearch(E item, Node node){
    if (head == null){
        return -1;
    }else if (node.data.equals(item)){
        return searchCnt;
    }else{
        searchCnt++;
        return recSearch(item, node.next);
    }
}

我觉得它应该正确计数,因为它必须在每次无法满足if和else if条件时计算,但我不是在正确的位置递增?或者我完全离开了?谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

在调用searchCnt之前,您需要在search()内将recSearch()设置为0。此外,您还需要测试node == null,而不是head == null

或者,您可以尝试这样做:

public int search(E item) {
    return recSearch(item, head, 0);
}

public int recSearch(E item, Node node, int index){
    if (node == null){
        return -1;
    }else if (node.data.equals(item)){
        return index;
    }else{
        return recSearch(item, node.next, index + 1);
    }
}

它消除了对类/实例变量的需要。

请注意,这不允许节点上的null数据。要支持null值,在检查if/else后,您需要另一个node == null分支:

}else if (item == null && node.data == null) {
    return index;
}

答案 1 :(得分:1)

您希望在递归时传递searchCnt var,以便正确更新。

public int search(E item) {
    return recSearch(item, head, 1);
}

public int recSearch(E item, Node node, int searchCnt){
    if (head == null){
        return -1;
    }else if (node.data.equals(item)){
        return searchCnt;
    }else{
        return recSearch(item, node.next, ++searchCnt);
    }
}

初始调用中的1假设,如果您在recSearch的第一次迭代中找到了您的项目,则该项目将被视为一次搜索(而search将返回1在那种情况下)。