Java实现3x+1算法运行结果异常,是代码哪里出现了问题?
问题原因
你的错误主要有两处:
- 输入读取逻辑错误
你调用的System.in.read()方法的作用是读取输入流中单个字符的ASCII码值,而非将输入的数字字符串转为对应整数。你输入字符'2'时,其对应的ASCII十进制值恰好是50,这和你运行结果中第一个输出值完全匹配,程序实际是从50开始执行3x+1逻辑,自然和你预期的输入2的运行结果不一致。 - 递归终止判断位置错误
你当前的终止判断写在数值修改逻辑之后,会导致两个问题:
- 初始输入为1时,会先执行一次逻辑再判断,步数统计错误
- 数值变为1后不会立刻终止,会多执行一次循环步骤
修正方案
首先引入java.util.Scanner来正确读取整数输入,再调整终止判断的位置,修正后的完整代码如下:
package de.craftingdani.math.main; import java.util.Scanner; public class Main { static long count = 0; public static void main(String[] args) { try(Scanner scanner = new Scanner(System.in)) { System.out.println("Please put in a number: "); tryNumber(scanner.nextInt()); } catch(Exception e) { System.err.println("Error, please give a valid number"); e.printStackTrace(); } } public static void tryNumber(int input) throws InterruptedException { // 进入方法先判断是否达到终止条件 if(input == 1) { System.out.println(input); System.out.println("reached 4, 2, 1 loop.\nTook " + count + " steps."); return; } Thread.sleep(100); System.out.println(input); switch(input % 2) { case 0: //even input = input / 2; count++; break; case 1: //odd input = 3 * input + 1; count++; break; } tryNumber(input); } }
修正后输入2的运行结果符合预期:
Please put in a number: 2 1 reached 4, 2, 1 loop. Took 1 steps.
内容的提问来源于stack exchange,提问作者CraftingDani
相关产品推荐
相关产品推荐

