无限循环在哪里?

时间:2011-09-30 09:37:13

标签: java infinite-loop

你好,这是我在溢出时的第一条消息(对不起,如果问题太长),我也是java和英语的初级。

我最近读过一款精神游戏。问题是这样的: 有四个女人,他们的名字是:kirmizi - yesil -sari -mavi (这些是土耳其语中的颜色名称)每个女人都穿着这些颜色的裙子。例如;

mavi女士穿着纱丽裙

但有两条规则:

女士的裙子颜色都不应与她们的名字相同

他们的名字和裙子的长度也不能相等。例如,mavi女人不能穿纱丽裙。但她可以穿kirmizi和yesil。

你能找到每个女人的裙子颜色吗?

我试图解决它,但它进入无限循环

颜色= RENK 土耳其语中的name = isim:)

编辑:我刚发现了新的线索。小姐kirmizi和纱丽不能穿mavi和yesil裙子。他们的裙子也是不同的颜色。如果你愿意,我可以写出答案,但我相信这对像我这样的初学者来说是一个很好的问题:)

package ana;

class Ana {

   static boolean birtobir=false;
   static boolean ikitoiki=false;
   static boolean uctouc=false;
   static boolean dorttodort=false;

   String renk;
   String isim;
   public static void main(String[] args) {

        String[] isimler={"bir","iki","uc","dort"};
        String[] renkler={"kirmizi","sari","yesil","mavi"};

        Ana bir = new Ana();
        bir.isim = "kirmizi";
        bir.renk="kirmizi";

        Ana iki = new Ana();
        iki.isim = "sari";
        iki.renk="sari";

        Ana uc = new Ana();
        uc.isim = "yesil";
        uc.renk="yesil";

        Ana dort = new Ana();
        dort.isim = "mavi";
        dort.renk="mavi";

        while ( birtobir=true && bir.renk.matches(bir.isim))
               while( ikitoiki=true && iki.renk.matches(iki.isim) )
                      while( uctouc=true && uc.renk.matches(uc.isim) )
                              while( dorttodort=true && dort.renk.matches(dort.isim)) {

                                    for (int a=0;a<renkler.length;a++) {
                                        bir.renk=renkler[a];

                                        if(bir.renk.length()==bir.isim.length()) {
                                            boolean birtobir=true;
                                        }

                                        for (int b=0;b<renkler.length;b++) {
                                            iki.renk=renkler[b];

                                            if(iki.renk.length()==iki.isim.length()) {
                                                boolean ikitoiki=true;
                                            }

                                            for (int c=0;c<renkler.length;c++) {
                                                uc.renk=renkler[c];

                                                if(uc.renk.length()==uc.isim.length()) {
                                                boolean uctouc=true;

                                                for (int d=0;d<renkler.length;d++) {
                                                     dort.renk=renkler[d];

                                                }
                                                if(dort.renk.length()==dort.isim.length()){
                                                     boolean dorttodort=true;
                                                }

                                            }
                                        }   
                                    }
                               }                        
     } 


    System.out.println(bir.isim+"="+bir.renk);
    System.out.println(iki.isim+"="+iki.renk);
    System.out.println(uc.isim+"="+uc.renk);
    System.out.println(dort.isim+"="+dort.renk);


    }
}

4 个答案:

答案 0 :(得分:6)

这只是猜测,但在这里:

while ( birtobir=true && bir.renk.matches(bir.isim))
               while( ikitoiki=true && iki.renk.matches(iki.isim) )
                      while( uctouc=true && uc.renk.matches(uc.isim) )
                              while( dorttodort=true && dort.renk.matches(dort.isim)){

您最有可能:birtobir==true && .. ikitoiki==true && ... uctouc==true && ... dorttodort==true [使用运算符== 而不是运算符= ]

birtobir=true将birtobir设置为true,而birtobir==true检查变量是否为true。

有关operators in java

的更多详情

如果它不是错误,并且您实际上想要设置可变性 - 这是一个糟糕的样式,您应该refactor您的代码。

修改 还有一点我可以注意到:

   if(bir.renk.length()==bir.isim.length()){
            boolean birtobir=true;
        }

在这里,您创建一个名为birtobir的新变量,并将其设置为true。此变量不是while循环中检查[或应该检查]的变量。我假设你实际上想要将类成员设置为true。为此,请将boolean birtobir=true;替换为birtobir=true;

答案 1 :(得分:0)

单个=为变量赋值,而==检查相等性。这意味着您应该更改while循环中的条件以检查是否相等而不是分配值。

即。 while ( birtobir=true && bir.renk.matches(bir.isim))实际上与while (bir.renk.matches(bir.isim))相同。 因此应将其更改为while ( birtobir==true && bir.renk.matches(bir.isim))

编辑:amit说..

答案 2 :(得分:0)

这是我的演绎。如果我理解正确,您想要打印所有有效组合吗?

public class Colours
{
  private static String[] names = new String[]{"kirmizi","yesil", "sari", "mavi"};
  private static String[] colors = new String[]{"kirmizi","yesil", "sari", "mavi"};


  public static void main(String[] args)
  {
    for (int i = 0; i < names.length; i++)
    {
      for (int j = 0; j < colors.length; j++)
      {
        if(allowed(names[i], colors[j])) {
          System.out.println(names[i] + " may wear " + colors[j]);
        }
      }
    }
  }

  private static boolean allowed(String name, String color) {
    return (!name.equals(color)) && (name.length() != color.length());
  }
}

答案 3 :(得分:0)

无法确定发生了什么,但您似乎需要多次循环。

我尝试从一个简单但简单的算法开始:

for (person in persons) {
    for (color in skirtColors) {
        if (person.name != color && person.name.lenght != color.lenght) {
            person.skirtColor = color;
        } else {
            person.skirtColor = "";
        }
    }

    if (allPersonsHaveSkirts(persons)) {
        // a more complete check should be done
        // to make sure they all have different colored skirts
        printSolution();
    }
}

通过使用2个简单的有限for循环,可以保证不会发生无限循环。