Java While循环与反向Fibonacci
我遇到了一个问题。我试图创建一个类,它接受用户输入的最大数字,并在它前面添加整数,直到它变为0,然而,当我运行它时,数字会越来越大,直到崩溃。是什么把它扔进了一个无限循环Java While循环与反向Fibonacci,java,loops,while-loop,Java,Loops,While Loop,我遇到了一个问题。我试图创建一个类,它接受用户输入的最大数字,并在它前面添加整数,直到它变为0,然而,当我运行它时,数字会越来越大,直到崩溃。是什么把它扔进了一个无限循环 public class Summation { public static void main(String[] args) { EasyReader console = new EasyReader(); System.out.print("Debug? (Y/N): ");
public class Summation {
public static void main(String[] args) {
EasyReader console = new EasyReader();
System.out.print("Debug? (Y/N): ");
char debug = console.readChar();
if ((debug!='Y')&&(debug!='N')){
System.out.println("Please enter Y or N");
main(null);
}
else{
System.out.print("Enter max range:");
int max = console.readInt();
int s = sum(max,debug);
System.out.print(s);
}
}
public static int sum(int m, char d){
int sm = 1;
boolean isRunning = true;
while ((isRunning == true)&&(d=='Y')){
if ((--m)==0) {
isRunning = false;
}
else{
sm = m+(--m);
System.out.println("sm is"+sm);
}
while ((isRunning == true)&&(d=='N')){
if ((--m)==0) {
isRunning = false;
}
else{
sm = m+(--m);
}
}
}return sm;
}
}
有一个场景,你的退出条件
if ((--m)==0)
将永远不会再次到达,因为m
已经小于0,并且永远不会返回
只要m
是偶数,就会出现这种情况
while ((isRunning == true)&&(d=='Y'))
{
// this condition decriments `m` every time it runs, regardless of whether it evaluates to true
if ((--m)==0)
{
// if `m` was set to 0 on your last iteration, it will be set to -1
isRunning = false;
}
else
{
// if m is 1 before this line it will be 0 after it.
sm = m+(--m);
System.out.println("sm is"+sm);
}
while ((isRunning == true)&&(d=='N'))
{
// this code will never get executed
}
}
return sm;
你的问题的答案很简单 只需修改条件
if (m==0) {
isRunning = false;
}
当您检查
--m==0
时,很可能m将跳过0并进入负区域,甚至没有将此条件设置为true。您所做的一切都是错误的:)
第一,格式化。你甚至可能不知道,但是第二个while在第一个while循环中。如果使用netbeans,则其ALT+SHIFT+F
对于您的示例,使用--m是不好的,因为它首先减小“m”值,然后进行比较。所以即使你问我
(--m)==0
减少一个值。因为你现在又在使用它了
sm = m+(--m)
您甚至可以跳过“0”值并进入负数
但是,如果您只想“在while循环中按从给定数字到0的相反顺序添加数字”,则不是斐波那契,您可以使用此代码(可以做得更好,但这是使用您的代码):
请注意,第二个while循环无法到达-它只在“d==Y”时通过,然后它只在“d==N”时开始所以您将两个正整数相互相加,并惊讶地发现结果大于数字?你真的想清楚了吗?这与编程无关,您的代码是完美的:它完全按照指定的方式执行。这是PEBKAC。@ppeterka66其中一个整数应该倒计时,直到它达到0为止,进程应该在该点终止。请注意,在您的条件中不要使用
isRunning==true
,isRunning
就足够了,它可以防止您错误地将布尔值赋给变量,如isRunning=true
@Showman-那么问题是这与斐波那契没有任何联系。。。这只是1和max之间所有数字的总和,我记得这是正确的,可以通过n*(n+1)/2
来解决,n是最大数-不需要单个循环。错误很可能是if语句的求值减少了m,而else语句再次减少了m……输入“Y”和501,它就可以结束了。你有什么意见?另外,嵌套的while
的目的是什么?最外层的while
将仅在d==“Y”时输入,因此嵌套循环将不会执行任何操作。
public class Summation {
public static void main(String[] args) {
System.out.println(sum(10, 'Y'));
}
public static int sum(int m, char d) {
int sm = 0;
boolean isRunning = true;
while ((isRunning == true) && (d == 'Y')) {
sm += m;
if (m == 0) {
isRunning = false;
} else {
m--;
System.out.println("sm is" + sm);
}
while ((isRunning == true) && (d == 'N')) {
if ((--m) == 0) {
isRunning = false;
} else {
sm = m + (--m);
}
}
}
return sm;
}
}