有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

递归Java返回问题

  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,我将打破循环,我修改问题

  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;
}

问题出现了,我无法得到堆栈中的第一个元素,但一直得到“null”作为答案,有什么建议吗


共 (1) 个答案

  1. # 1 楼答案

    question()的第二个版本中,只有两个return语句,第二个语句在col != 0时返回null

    因此,您似乎弄乱了递归方案,因为即使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,则立即返回它