日期:2014-05-18  浏览次数:20932 次

问个递归的问题
void add()
  {
   
  for (; i < 20; i++)
  {
  for (int j = 2; j < 10; j++)
  {
  if (i != j)
  {
  if (i % j == 0)
  {
  i++;
  if (i < 20)
  {
  add();
  }
  }

  }
  }
  textBox1.Text += i+",";
  }
   
  }


我想得到20以内的素数。但结果却是 2,3,5,7,11,13,17,19,22,23,26,29,31,33,34,37,38,41,

 请问一下“19”以后的数是怎么出来的?

------解决方案--------------------


for (; i < 20; i++) 

for (int j = 2; j < 10; j++)

if (i != j) 

if (i % j == 0) 

i++;
if (i < 20) 

add(); 





textBox1.Text += i+","; 



注意你的第二个循环,里面有个i++,当i=19的时候,你这个循环里面还会不停的i%j,不为0还是会加1的,一直到把i=19的情况都判断完毕。所以第一个循环外面你加个判断就好了
C# code

        void add()
        {

            for (; i < 20; i++)
            {
                for (int j = 2; j < 10; j++)
                {
                    if (i != j)
                    {
                        if (i % j == 0)
                        {
                            i++;
                            if (i < 20)
                            {
                                add();
                            }
                          
                        }

                    }
                }
                if (i > 20)
                {
                    break;
                }
                textBox1.Text += i + ",";
            }

        }

------解决方案--------------------
在方法外声明了 int i=2,这是造成问题的原因所在。相当于C++中i是一个全局变量。
在i<20前,已经满足了若干次的条件,在第二个循环里,足以让i>20