gpt4 book ai didi

java - 调用自身的递归搜索方法返回错误值

转载 作者:行者123 更新时间:2023-12-01 13:01:22 29 4
gpt4 key购买 nike

我正在编写一种在简单的对等网络中搜索客户端的方法。我编写的 searchForResponsibleClient 方法在该网络中获取一个点,并检查调用 searchForResponsibleClient 方法的客户端是否负责该点。

如果它负责,它就会返回自己。

如果它不负责,它会查看其客户端邻居(保存在对象中)并检查是否有任何邻居负责,如果是,则返回邻居。

这两种情况都可以正常工作。

但是,如果邻居不负责,则采用调用客户端的第一个邻居,并再次递归调用 searchForResponsibleClient 方法。

当我递归调用它时,我在控制台得到正确的输出,但返回值错误。

这是我的代码:

public ClientInterface searchForResponsibleClient(Position p) {
System.out.println("calling searchForResponsibleClient with " + this.uniqueID);


boolean contains = this.clientArea.contains(p);
System.out.println("calling client: "+ this.uniqueID);
System.out.println("The current client contains the element:"+ contains);

// the current client contains the document
if (contains){
System.out.println("current element is responsible" +this.uniqueID);
return this;
}

// apparently the current client is not responsible lets check the clients neighbours.
System.out.println("++++++++++++++++++++++++++++++++++++++++++");
System.out.println("calling element: "+ this.uniqueID + " has this neighbours:");
for(ClientInterface neighbour: this.neighbours){
System.out.println(neighbour.getUniqueID());
System.out.println("contains the position : "+neighbour.getArea().contains(p));
if(neighbour.getArea().contains(p)){
System.out.println("found golden neighbour; "+neighbour.getUniqueID());
return neighbour;
}
}

System.out.println("+++++++++++++++++++++++++++++++++++++++++++");


// if the neighbours are not responsible lets get the first neighbour of the neighbourlist and restart the search
ClientInterface temporalClient = this.neighbours.get(0);
System.out.println("the first neighbour element is responsible: "+ temporalClient.getArea().contains(p));

if (!temporalClient.getArea().contains(p)){
System.out.println("Performing another search this client is callling it: "+ this.uniqueID +" with the client that it found but was not the right one: "+ temporalClient.getUniqueID());
temporalClient.searchForResponsibleClient(p);
}
else {
return temporalClient;
}
System.out.println("!!!!!! reached the position that i should never reach! !!!!!");
return null;
}

这是我的控制台的输出:

使用 client0 调用 searchForResponsibleClient
调用客户端:client0
当前客户端包含元素:false
++++++++++++++++++++++++++++++++++++++++++++
调用元素:client0 有这个邻居:
客户端3
包含位置: false
+++++++++++++++++++++++++++++++++++++++++++++
第一个邻居元素负责: false
执行另一次搜索,该客户端将其称为: client0 以及它找到的客户端,但不是正确的客户端: client3
使用 client3 调用 searchForResponsibleClient
调用客户端:client3
当前客户端包含元素:false
++++++++++++++++++++++++++++++++++++++++++++++调用元素:client3 有这个邻居:
客户端4
包含位置:true
找到了黄金邻居;客户端4
!!!!!!达到了我永远不应该达到的位置! !!!!!

在这种情况下,client4 应该包含位置(实际上就是这种情况),但返回的不是 client4,而是 null,这会导致 NullpointerException。我的 return 语句肯定在某个地方犯了错误,但不知何故,我就是不知道错误可能出在哪里。

最佳答案

您需要返回找到的最终值。看起来像修改这一行:

temporalClient.searchForResponsibleClient(p);

return temporalClient.searchForResponsibleClient(p);

应该可以解决问题。这将解释为什么您会到达您认为不应该到达的代码

关于java - 调用自身的递归搜索方法返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23492114/

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