【问题标题】:how to get recursive calls from a method如何从方法中获取递归调用
【发布时间】:2015-12-13 19:28:11
【问题描述】:

我刚写完一个数独求解器。它有两个类,一个控制台求解器和一个 gui 求解器。 控制台求解器有一个名为solve的方法,它递归地求解数独。 gui 扩展了控制台求解器,也使用了它的求解方法。在进行另一个递归调用之前,通过打印出方法内部的数独字段,很容易跟踪每个递归步骤,如下所示:

System.out.println(field);

// solve next cell
if (j < 8) solve(field, row, column + 1);
else solve(field, row + 1, 0;
}

但是如何在 gui 中显示字段中的更改? 我使用 JTable 在 gui 中显示数独字段。 目前我只显示结果,而不是导致它的步骤,这似乎有点无聊。

这里有一些更相关的代码:

/* solve button action listener/handler */


    solveButton.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {

             /* solve the sudoku and display it 
              * in solve table.
              */
                fieldToTable(field, solveTable); //put sudoku field in display
                try {
                    solve(field, 0, 0); // Solve starting at [0,0]
                } catch (SolvedException d) {
                    /* SOLVED */

                    }

                        } //End of action handler
            }); // End of action listener


    /* Done with solve button action listener */

【问题讨论】:

  • 你能发布更多相关的代码吗?
  • 我的第一个想法是让GUI实现一些可以更新您必要信息的接口,然后您的递归调用可以传递该接口实例并使用适当的信息调用接口方法(至少单元格位置和价值)
  • Yassin: 刚刚用 sudokuGUI 类 Cricket 中使用的代码编辑了帖子:对不起,但我对此一无所知。我是新手..

标签: java recursion call sudoku


【解决方案1】:

您可以在线程中“解决”它并在每次迭代中更新董事会。这是使用 Thread 的基本方法——更复杂的方法可能会使用 SwingWorker。

免责声明:您可能需要添加额外的检查,将一些变量设置为最终变量等等才能使这项工作正常进行。

  solveButton.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e) {
         /* solve the sudoku and display it in solve table. */
         fieldToTable(field, solveTable); //put sudoku field in display
         //Disable button while solving
         solveButton.setEnabled(false);
         //Start Thread to do the work
         new Thread() {
            public void run() {
              try { 
                 solve(field, 0, 0);
              } catch(SolvedException se) {
                //What now - reenable button                 
                SwingUtilities.invokeLater(() -> solveButton.setEnabled(true));
              }
            }
         }.start();                    
       } //End of action handler
    }); // End of action listener

并更改您的 solve() 以在每次调用时更新板:

public void solve(Field field, int x, int y) {
    SwingUtilities.invokeLater(() -> fieldToTable(field, solveTable));

    // YOUR SOLVE LOGIC
}

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 2023-04-10
    • 2019-09-29
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多