Java 递归函数有时有效

标签 java recursion stack-overflow

我已经运用了迄今为止所学到的知识,但仍然无法解决这个问题,所以决定来到这里。

BasicBlock 对象由整数引用,并保存对列表中更多 block 的“地址”的引用。我想获取它们引用的地址,并且我想递归地执行此操作。一个 BasicBlock 可以保存对 0 个或多个其他 block 的引用。

下面的递归函数 getFunctionReferences 不断返回堆栈溢出错误,但有时仍能正常工作。

Map<Integer,BasicBlock> blockList blockList = new TreeMap<Integer,BasicBlock>();

public HashSet<Integer> getAssociatedAddresses(int function) {
    HashSet<Integer> blockAddresses = new HashSet<Integer>();   
    getFunctionReferences(this.blockList.get(function),blockAddresses);
    return blockAddresses;
}

private void getFunctionReferences(BasicBlock block, HashSet<Integer> blockAddresses){ 
    for (int x : block.getAddressReferenceList()) {  
        blockAddresses.add(x);
        getFunctionReferences(this.blockList.get(x), blockAddresses);
    }
}

我知道我在这个调用中做错了什么,特别是因为没有基本情况。但我不知道在这样的循环中如何处理递归......我也不知道合适的基本情况。

非常感谢您的帮助。

谢谢

最佳答案

如果存在循环(例如, block 1 引用 block 2, block 2 引用 block 3, block 3 引用 block 1),您将获得无限递归,导致 StackOverflowError

为了避免这种情况,您可以利用您维护的已访问 block 的 HashSet。您可以简单地检查一个 block 是否已被访问,并避免再次进行递归调用:

private void getFunctionReferences(BasicBlock block, HashSet<Integer> blockAddresses){ 
    for (int x : block.getAddressReferenceList()) {  
        if (blockAddresses.add(x)) { // only make a recursive call if x wasn't already
                                     // in the Set
            getFunctionReferences(this.blockList.get(x), blockAddresses);
        }
    }
}

关于Java 递归函数有时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49225783/

相关文章:

c# - 如果 SelectionChanged 事件触发得太快,WPF Treeview 会溢出吗?

java - 编写java程序对随机字符串中的所有整数求和

c# - 创建类的实例时出现问题

PrintService 属性的 Java 序列化

java - 在Java中查找特定文件夹

Scala尾递归

javascript - 是否可以从内部 Promise 获取父函数的回调?

将项目添加到列表时出现 java.lang.StackOverflowError

java - 无法在上下文加载之前在 spring 中发布自定义事件

java - 在 JTextArea 中突出显示和更改文本颜色