0

我遇到了一个问题。我正在尝试创建一个类,它采用用户输入的最大数字并在它之前添加整数直到它变为 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;
    }
}
4

3 回答 3

0

有一种情况是您的退出条件

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;
于 2013-10-09T20:01:45.293 回答
0

回答你的问题很简单 修改条件即可

if (m==0) {
    isRunning = false;
}

当您检查--m == 0时,m 很有可能会跳过 0 并进入负区域,甚至无需将此条件设置为 true。

于 2013-10-09T20:06:54.063 回答
0

你所做的一切都是错误的:)。

首先 - 格式化。你甚至可能不知道,但第二个 while 在第一个 while 循环内。如果你使用netbeans,它的ALT+SHIFT+F。

使用 --m 对您的示例不利,因为它首先减小“m”值,然后进行比较。所以即使你问

(--m)==0

你减少一个值。而且因为您再次使用它

sm = m+(--m)

您甚至可以跳过“0”值并输入负数。

但是,如果您只想“在while循环中以相反的顺序将数字从给定数字添加到0”,它不是斐波那契,您可以使用此代码(它可以做得更好,但这是使用您的代码):

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

请注意,无法达到第二个 while 循环 - 它仅在“d == Y”时通过,然后仅在“d == N”时开始

于 2013-10-09T20:07:24.733 回答