2010-10-21 24 views
1
public void question(int col, int n, Node<Integer> part_soln) { 
     if (col==0) stack.push(part_soln); 
     else for (int row=1; row<=n; row++) 
       { if (!exists(row,part_soln) && !unsafe(col,row,col+1,part_soln)) 
        { Node<Integer> new_soln = new Node<Integer>(row,part_soln); 
        question(col-1,n,new_soln); 
        } 
       } 
    } 

我被插入part_soln入堆棧,但現在我想第一part_soln而不是堆棧,我將打破循環,一旦我得到的part_soln,我修改的問題成爲Java的回報問題

public void question(int col, int n, Node<Integer> part_soln) { 
     if (col==0) return part_soln; 
     else for (int row=1; row<=n; row++) 
       { if (!exists(row,part_soln) && !unsafe(col,row,col+1,part_soln)) 
        { Node<Integer> new_soln = new Node<Integer>(row,part_soln); 
        question(col-1,n,new_soln); 
        } 
       } 
return null; 
} 

問題發生,我不能得到堆棧中的第一個元素,但不斷得到「空」作爲答案,任何建議?

+0

你用什麼參數調用'question'?是不是應該返回'Node '而不是'void'? – 2010-10-21 13:01:40

+0

當你在'question(col-1,n,new_soln)'中調用'question'時,你想用返回值做些什麼嗎? – 2010-10-21 13:04:10

+0

你和user478763一樣嗎?如果是這樣,那麼你現在在這裏提出的六個完全無法回答的問題,產生4的總聲望(可能會下降)。 – DJClayworth 2010-10-21 13:56:18

回答

2

question()的第二個版本中,只有兩個return語句,第二個返回null,只要col != 0

所以你似乎搞砸了你的遞歸方案,因爲即使question()在循環中遞歸調用自身,也不會使用返回值。

這將有助於瞭解該方法應該做什麼。但無論如何,我試圖修復它根據您提供的信息(要查找並返回的第一個合適的解決方案)是

public Node<Integer> question(int col, int n, Node<Integer> part_soln) { 
    if (col==0) 
     return part_soln; 
    else for (int row=1; row<=n; row++) { 
     if (!exists(row,part_soln) && !unsafe(col,row,col+1,part_soln)) { 
      Node<Integer> new_soln = new Node<Integer>(row,part_soln); 
      Node<Integer> ret = question(col-1,n,new_soln); 
      if (ret != null) 
       return ret; 
     } 
    } 
    return null; 
} 

不同的是,我存儲從遞歸調用,如果返回值不是null,立即返回。

+1

如何返回「void」方法的工作? :-) – rsp 2010-10-21 13:19:15

+0

@rsp,哎呀,很好,趕上,謝謝。我注意到並評論了OP中的問題,然後在我的版本中未能對其進行更正。現在修復。 – 2010-10-21 13:47:31