public static void searchForChains(Synset source,Synset target,Chain inherit)
{
if(inherit.size() < max+1)
{
try
{
PointerTargetNodeList sourceParent =
PointerUtils.getInstance().getDirectHypernyms(source);
int size1 = sourceParent.size();
if(0 != size1)
{
for(Iterator it = sourceParent.iterator();it.hasNext();)
{
PointerTargetNode Node = (PointerTargetNode)it.next();
if(!target.equals(Node.getSynset()))
{
if(!inherit.hasCircle(Node.getSynset()))
{
Chain temp1 = (Chain)inherit.clone();
temp1.add(new Chain(Node.getSynset(),"hypernym",null));
searchForChains(Node.getSynset(),target,temp1);
}
else
{
return;
}
}
else
{
inherit.add(new Chain(Node.getSynset(),"hypernym",null));
Chains.add(inherit);
return;
}
}
} PointerTargetNodeList sourceChild =
PointerUtils.getInstance().getDirectHyponyms(source);
int size2 = sourceChild.size();
if(0 != size2)
{
for(Iterator it = sourceChild.iterator();it.hasNext();)
{
PointerTargetNode Node = (PointerTargetNode)it.next();
if(!target.equals(Node.getSynset()))
{
if(!inherit.hasCircle(Node.getSynset()))
{
Chain temp2 = (Chain)inherit.clone();
temp2.add(new Chain(Node.getSynset(),"hyponym",null));
searchForChains(Node.getSynset(),target,temp2);
}
else
{
return;
}
}
else
{
inherit.add(new Chain(Node.getSynset(),"hyponym",null));
Chains.add(inherit);
return;
}
}
} PointerTargetNodeList sourceHolonym =
PointerUtils.getInstance().getHolonyms(source);
int size3 = sourceHolonym.size();
if(0 != size3)
{
for(Iterator it = sourceHolonym.iterator();it.hasNext();)
{
PointerTargetNode Node = (PointerTargetNode)it.next();
if(!target.equals(Node.getSynset()))
{
if(!inherit.hasCircle(Node.getSynset()))
{
Chain temp3 = (Chain)inherit.clone();;
temp3.add(new Chain(Node.getSynset(),"holonym",null));
searchForChains(Node.getSynset(),target,temp3);
}
else
{
return;
}
}
else
{
inherit.add(new Chain(Node.getSynset(),"holonym",null));
Chains.add(inherit);
return;
}
}
} PointerTargetNodeList sourceMeronym =
PointerUtils.getInstance().getMeronyms(source);
int size4 = sourceMeronym.size();
if(0 != size4)
{
for(Iterator it = sourceMeronym.iterator();it.hasNext();)
{
PointerTargetNode Node = (PointerTargetNode)it.next();
if(!target.equals(Node.getSynset()))
{
if(!inherit.hasCircle(Node.getSynset()))
{
Chain temp4 = (Chain)inherit.clone();
temp4.add(new Chain(Node.getSynset(),"meronym",null));
searchForChains(Node.getSynset(),target,temp4);
}
else
{
return;
}
}
else
{
inherit.add(new Chain(Node.getSynset(),"meronym",null));
Chains.add(inherit);
return;
}
}
}
}
catch(JWNLException e)
{
e.printStackTrace();
}
}
}
//以上是两个相互调用的函数合成的递归函数,以下是两个相互调用的函数
public static void searchForChains(Synset source,Synset target,Chain inherit)
{
if(inherit.size() < max+1)
{
try
{
PointerTargetNodeList sourceParent =
PointerUtils.getInstance().getDirectHypernyms(source);
int size1 = sourceParent.size();
if(0 != size1)
{
Chain temp1 = (Chain)inherit.clone();
searchForChain(sourceParent,target,temp1,1);
}
PointerTargetNodeList sourceChild =
PointerUtils.getInstance().getDirectHyponyms(source);
int size2 = sourceChild.size();
if(0 != size2)
{ Chain temp2 = (Chain)inherit.clone();
searchForChain(sourceChild,target,temp2,2);
} PointerTargetNodeList sourceHolonym =
PointerUtils.getInstance().getHolonyms(source);
int size3 = sourceHolonym.size();
if(0 != size3)
{ Chain temp3 = (Chain)inherit.clone();
searchForChain(sourceHolonym,target,temp3,3);
} PointerTargetNodeList sourceMeronym =
PointerUtils.getInstance().getMeronyms(source);
int size4 = sourceMeronym.size();
if(0 != size4)
{
Chain temp4 = (Chain)inherit.clone();
searchForChain(sourceMeronym,target,temp4,4);
}
}
catch(JWNLException e)
{
e.printStackTrace();
}
}
else
{
return;
}
}
public static void searchForChain(PointerTargetNodeList list,Synset target,Chain inherit,int type)
{
for(Iterator it = list.iterator();it.hasNext();)
{
PointerTargetNode Node = (PointerTargetNode)it.next();
if(!target.equals(Node.getSynset()))
{
if(!inherit.hasCircle(Node.getSynset()))
{
Chain temp = (Chain)inherit.clone();
switch(type)
{
case 1:
temp.add(new Chain(Node.getSynset(),"hypernym",null));
break;
case 2:
temp.add(new Chain(Node.getSynset(),"hyponym",null));
break;
case 3:
temp.add(new Chain(Node.getSynset(),"holonym",null));
break;
case 4:
temp.add(new Chain(Node.getSynset(),"meronym",null));
break;
default:
break;
}
searchForChains(Node.getSynset(),target,temp);
}
else
{
return;
}
}
else
{
switch(type)
{
case 1:
inherit.add(new Chain(Node.getSynset(),"hypernym",null));
break;
case 2:
inherit.add(new Chain(Node.getSynset(),"hyponym",null));
break;
case 3:
inherit.add(new Chain(Node.getSynset(),"holonym",null));
break;
case 4:
inherit.add(new Chain(Node.getSynset(),"meronym",null));
break;
default:
break;
}
Chains.add(inherit);
return;
}
}
}//运行结果很不一样,对于两个函数的那个运行的时候max值大于7就会发生java heap space的错误
//而对于合成的那个递归函数又不能得到所要的结果,麻烦帮帮忙,谢谢了
//这两种写法有什么区别呢?那个堆空间的问题如何解决?