gpt4 book ai didi

Java 递归函数有时有效

转载 作者:行者123 更新时间:2023-11-30 02:13:51 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com