【问题标题】:Where is the infinite loop?无限循环在哪里?
【发布时间】:2011-09-30 09:37:12
【问题描述】:

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

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

mavi 女人穿纱丽裙

但是有两条规则:

所有女性的裙子颜色都不能和名字一样

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

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

我已经尝试解决它,但它进入了无限循环

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

编辑:我刚刚发现了新的线索。 kirmizi 和 sari 小姐不能穿 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);


    }
}

【问题讨论】:

  • 您应该从正确缩进代码开始,这样其他人阅读起来就不会那么困难了。此外,与其提供翻译指南,不如进行搜索和替换。
  • 您是否尝试使用调试器并查看 inifite 循环在哪里?当您处于无限循环时,哪个变量/s 是常数或超出范围?
  • 嗨。请您解释变量birtobirikitoikiuctoucdorttodort 的含义?此外,将 cmets 添加到描述正在发生的事情的代码中不仅可以帮助其他人分析它,还可以帮助您自己理解它。
  • 在最里面的循环中添加一个 System.out.println,这样您就可以看到那里发生了什么——或者使用调试器。
  • 乍一看,main 方法似乎只是要返回而不经过任何循环;你定义了birtobir=false,你的第一个循环是while ( birtobir=true &amp;&amp; bir.renk.matches(bir.isim))

标签: java infinite-loop


【解决方案1】:

这只是一个猜测,但在这里:

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 &amp;&amp; .. ikitoiki==true &amp;&amp; ... uctouc==true &amp;&amp; ... dorttodort==true [使用 operator== 而不是 operator=]

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

更多详情operators in java

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

编辑: 我还注意到一件事:

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

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

【讨论】:

  • 很好看。此外,在检查布尔值时,根本不需要使用 ==if (birtobir &amp;&amp; ...if (birtobir==true &amp;&amp; ... 更好
【解决方案2】:

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

I.E. while ( birtobir=true &amp;&amp; bir.renk.matches(bir.isim)) 实际上与 while (bir.renk.matches(bir.isim)) 相同。 因此应该改为while ( birtobir==true &amp;&amp; bir.renk.matches(bir.isim))

编辑:阿米特说什么..

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 不,不,不是所有有效的组合。我需要找出哪个女人穿着哪条裙子?但是你的代码非常好和简单,它对我帮助很大,谢谢
    【解决方案4】:

    无法确定发生了什么,但您似乎有很多周期。

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

    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 循环,您可以保证不会发生无限循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 2014-10-10
      相关资源
      最近更新 更多