Stack Overflow错误:我将如何迭代地编写此方法?

时间:2014-04-20 20:21:53

标签: java recursion iteration stack-overflow

我在递归调用时遇到以下方法的堆栈溢出错误。我想我需要迭代才能使它工作。我将如何迭代地编写以下方法?

Node myMethod(String foo, Node p) {
   if(p == null) {
       p = new Node(foo);
       p.link = spot;
       spot = p;
       p.calc[bar] = 1;
   return p;
   } else if(foo.equals(p.origin)) {
       p.calc[bar] = p.calc[bar] + 1;
       return p;
   } else { 
         while (p.next == null & foo.equals(p.origin)){
             p = p.next;
         }
       p.next = myMethod(foo, p.next);
       return p;
   }
}

p是一个包含String fooString originNode linkNode next和int数组calc[]的Node类。 bar是一个int。 spot是一个随机节点。

这是我到目前为止所尝试的

Node myMethod(String foo, Node p) {
if(p == null) {
   p = new Node(foo);
   p.link = spot;
   spot = p;
   p.calc[bar] = 1;
return p;
} else if(foo.equals(p.origin)) {
    p.calc[bar] = p.calc[bar] + 1;
    return p;
} else { 
    while (p.next == null & foo.equals(p.origin)){
         p = p.next;
    }
//instead of doing recursion on: p.next = myMethod(foo, p.next);. I tried the following:
    if (p.next == null){
        p.next = new Node(foo);
        p.next.link = spot;
        spot = p.next;
        p.next.calc[bar] = 1;
    } else if (foo.equals(p.next.origin)){
        p.next.calc[bar] = p.next.calc[bar] + 1;
    } else {
        while (p.next.next == null & foo.equals(p.next.origin)){
        p.next = p.next.next;
        }
      }
   }
 return p;
 }

2 个答案:

答案 0 :(得分:1)

虽然你的迭代尝试可能写得更好,但这是一个很好的尝试。但是,请看这里:

else { 
    while (p.next == null & foo.equals(p.origin)){ //HERE! Check the while argument.
         p = p.next;
    } //instead of doing recursion on: p.next = myMethod(foo, p.next);. I tried the following:
    …

如果p.next为null或foo不等于p.origin,则while循环将停止。现在基本的方法是在这里提供三种情况:

  1. p.next!= null 时(第一次条件时)该怎么办
  2. !foo.equals(p.origin)(第二次条件)时你该怎么办//你没有写它。
  3. p.next!= null&& !foo.equals(p.origin)
  4. 如果你的条件是正确的(你想要的那些条件),你需要服务于while循环可能停止的所有情况,并且应该是你的算法结束。如果不是,请重新考虑您的while循环条件。

答案 1 :(得分:0)

我仍然没有完全回应你想要做的事情,这段代码看起来很糟糕,但也许它可以满足您的需求。

Node myMethod(String foo, Node p) {
    while(p != null) {
        if(foo.equals(p.origin)) {
            p.calc[bar] = p.calc[bar] + 1;
            break;
        }
        p = p.next;
    }
    if(p == null) {
        p = new Node(foo);
        p.link = spot;
        spot = p;
        p.calc[bar] = 1;
    }
    return p;
}