Tag: recursion

Java:递归-While Loop Vs If Loop

代码设计1:完美运行 public static void main (String[] args) { recursion(2); } public static void recursion(int num) { if (num > 0) { recursion( num – 1 ); System.out.println(num); } } 代码设计2:无限循环。 ? public static void main (String[] args) { recursion(2); } public static void recursion(int num) { if (num == 0) return; while (num > 0) […]

二进制搜索树toString

我无法以我教授想要的格式打印出二叉搜索树。 他的格式如下: {(12,10,13),(10,8,11),(8,6,9),(6,4,7),(4,2,5),(2,1,3),(1,*,*),(3,*,*),(5,*,*),(7,*,*),(9,*,*),(11,*,*),(13,*,*)} 子集中的第一个数字是根节点,左右节点是左右子节点。 然后,在循环迭代后,左子节点成为根节点。 一切正常,直到我到达子集中只有一个节点的地方。 它只是打印(1,*,*)直到结束,我无法弄清楚如何以另一种方式做到这一点。 是否有可能以递归方式执行此toString方法? 我的代码: public String toString() { if (root == null) return “{}”; String str = “{“; Node tmp = root; for (int i = 0; i < size; i++) { if (tmp.right != null && tmp.left == null) str += "("+tmp.data+", "+tmp.right.data+", *)"; if (tmp.left != null && […]

一个完整的二进制搜索树,在Java中插入了级别顺序

我们得到了一个我们需要编码的作业: 二进制搜索树 树必须是完整的 ,而不是完美的 (这意味着所有不在最低级别或第二低级别的节点应该有2个子节点,而最低级别的节点应该尽可能地离开) 我们需要按级别顺序插入树 因此,如果我有一个元素{0, 1, 2, 3, 4, 5, 6, 7}的数组,则root应为4 ,左侧为2,1,3,0,以及6, 5, 7在右侧。 级别顺序插入将是: 4, 2, 6, 1, 3, 5, 7, 0 只需占用数组的中间并将其作为root用户不起作用。 如果你得到一个1到9个元素的数组,你将有4个作为root(java中的int值,double将是4.5),右边有5个元素,左边有4个元素。 这不是一棵完整的树。 甚至不是一棵完美的树。 我的代码只能向左或向右插入,这取决于它是否比根更小,没有水平顺序插入。 Anytype x参数是要插入的值,而BinaryNode t是我们在树中的当前节点(如果我们需要向左或向右插入新值,我们的比较方式) private BinaryNode insert( AnyType x, BinaryNode t ) { if( t == null ) return new BinaryNode( x, null, null ); […]

解决数独的递归方法

我目前正在学习我的第二个java编程课程,并且我需要完成一项通过该课程的作业有问题。 基本上它是关于编写一个程序,递归地解决数据与回溯。 这是我提出的算法。 我使用了一个9×9数组来表示网格,该网格在开头用零填充。 checkFill检查是否可以将数字(var)插入位置[i] [j]。 问题是它只解决了数据,它总是返回false(没有解决方案),有些单元格仍然包含零。 我在这做错了什么? import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Sudoku { private int[][] sudoku; private JFrame frame; private JFormattedTextField[][] sudokuSquares; private JButton solve, clear; public Sudoku() { sudoku = new int[9][9]; frame = new JFrame(“Sudoku Solver”); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel northPanel = new JPanel(); northPanel.setLayout(new GridLayout(9, 9)); northPanel.setBorder(BorderFactory.createEmptyBorder(10, […]

打破听众的递归

我试图打破一个使这段代码递归的特殊情况。 我有一个Javafx游戏,其中有人和计算机玩家在轮到他的时候玩,并且可以有很多回合。 计算机应该自动播放并立即移动到下一个播放器并且不向UI显示任何直接指示(但是可以查看它之后做了什么)。 问题是在只有电脑玩家的情况下,我们会在当前装载电脑的时候来到这里,输入条件,因为所有玩家都是电脑,设置下一个播放器的电路板,然后无需完成通话,请拨打此电话同样的function: currentBoardPane.addListener((e) -> { if(gameManager.checkIfCurrentPlayerIsComputer()){ gameManager.playAutoMovesForCurrentPlayer(); gameManager.setNextPlayer(); // it does current player property = next player //update board on scene currentBoardPaneIndex = ((currentBoardPaneIndex + 1) % gameManager.getPlayers().size()); currentBoardPane.setValue(boardPanes.get((currentBoardPaneIndex))); //this is a recursive call } }); 取而代之的是,如果我在GameManager为currentPlayer属性订阅一个监听器,那么我仍然需要从该监听器调用setNextPlayer() ,这又是递归的。 如果所有玩家都是计算机,我可以制作一个特例,然后从一段while(true){}而不是听众和绑定运行游戏,但必须有更好的方法来打破这种递归。 还有一种方法是在没有听众和绑定的情况下不进入递归吗? 笔记: currentBoardPane表示屏幕上的当前游戏板,它是一个ObjectProperty 。

扫雷艇stackoverflower

我正在为扫雷编写一种方法,如果那里没有我的话,就会打开一个小区。 如果地雷旁边没有相邻的单元格,它会打开周围没有地雷的单元格。 我经常有这个错误: 线程“AWT-EventQueue-0”中的exceptionjava.lang.StackOverflowError这是我的源代码: public void open(int row, int col) { // row = vertical index of the matrix // col = horizontal index of matrix unclicked–; butt[row][col].setEnabled(false); // disable the called button if (aray[row][col] !=0) // checks if there are no adjacent cells with an adjacent mine count >0 butt[row][col].setText(Integer.toString(aray[row][col])); else{ if(row < size-1){ […]

计算方法调用堆栈大小以检查StackOverflowException

今天早上我回答了一个与StackoverflowException相关的问题。 该人询问何时发生Stackoverflowexception 查看此链接在C#,C ++和Java中导致堆栈溢出的最简单方法 所以我的问题是,有没有任何方法可以在程序中动态计算方法调用堆栈大小,然后在调用方法之前应用检查,该方法检查方法调用堆栈是否有空间来容纳它,以防止StackOverflowException。 因为我是一个java人,我正在寻找java,但也寻找与概念相关的解释,没有任何编程语言的限制。

Java:如何递归获取所有子目录?

在调试延迟时间外的递归函数之前:是否有一个获取子目录的命令? giveMeSubDirs(downToPath) ? // WARNING: RECURSION out of bound or too much data public HashSet getAllDirs(String path) { HashSet checkedDirs = new HashSet(); HashSet allDirs = new HashSet(); String startingPath = path; File fileThing = new File(path); FileObject fileObject = new FileObject(fileThing); for (FileObject dir : getDirsInDir(path)) { // SUBDIR while ( !checkedDirs.contains(dir) && !(getDirsInDir(dir.getFile().getParent()).size() […]

具有反向跟踪的数独求解算法

我正在寻求实现一个非常简单的算法,该算法使用powershell反向跟踪来解决数独网格。 我面临的问题是,在我的实现中,我为一个名为row和col的Sudoku类包含了两个实例变量,它们对应于表示Sudoku网格的二维数组中的空单元格的行和列。 当我的solve()方法执行时,它首先检查是否没有任何空单元格,在这种情况下拼图已经完成。 否则,同一方法将空单元格的行和列分配给包含网格的Sudoku对象的实例变量row和col 。 之后,for循环通过方法调用isSafe(int n)validation可以在该空单元格中放置哪个数字(此方法检查是否满足拼图的约束,我可以保证它完美地运行)。 因此, isSafe()方法在空单元格中放置一个数字,然后在Sudoku对象上再次对solve()方法进行递归调用。 如果我们遇到了无法满足的约束,那么我们将0重新分配给最后row和col 。 这就是问题所在! 由于程序不断更新row和col变量,因此每次递归调用都会丢失旧实例。 我一直在试图弄清楚如何存储这些值,以便程序可以在回溯时撤消操作。 我想把每个col和row推到一个堆栈,但我真的不知道该去哪里。 有人能告诉我解决这个问题的简单方法是什么? 我不包括整个课程,如果你觉得它有用,请告诉我,我会发布。 class Sudoku { int SIZE, N, row, col; int Grid[][]; public boolean solve() { if (!this.findNextZero()) return true; for (int num = 1; num <= 9; num++) { if (isSafe(num)) { this.Grid[this.row][this.col] = num; if (this.solve()) return true; […]

二进制搜索计算平方根(Java)

我需要帮助编写一个使用二进制搜索的程序来递归计算输入非负整数的平方根(向下舍入到最接近的整数)。 这是我到目前为止: import java.util.Scanner; public class Sqrt { public static void main(String[] args) { Scanner console = new Scanner(System.in); System.out.print(“Enter A Valid Integer: “); int value = console.nextInt(); calculateSquareRoot(value); } public static int calculateSquareRoot(int value) { while (value > 0) { double sqrt = (int) Math.sqrt(value); System.out.println(sqrt); } return -1; } } 它必须使用二进制搜索来计算平方根这一事实让我感到困惑。 如果有人对如何做到这一点有任何建议,将不胜感激。 谢谢