Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java While循环与反向Fibonacci_Java_Loops_While Loop - Fatal编程技术网

Java While循环与反向Fibonacci

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): ");

我遇到了一个问题。我试图创建一个类,它接受用户输入的最大数字,并在它前面添加整数,直到它变为0,然而,当我运行它时,数字会越来越大,直到崩溃。是什么把它扔进了一个无限循环

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