递归方法实现

时间:2014-10-16 03:38:37

标签: java algorithm recursion

想象一下n行灯只能在某些条件下打开或关闭,如下所示。第一盏灯可以随时打开或关闭。只有当前一盏灯亮起且其前所有其他灯熄灭时,才能打开或关闭其他每盏灯。关闭3个灯的示例如下:

111

011

010

110

100

000

我获得了turnOff()的算法,我想提出打开算法。

turnOff(n)
   if(n = 1) turn off light 1
   else {
         if(n>2) turnOff(n-2)
         turn off light n
         if(n>2) turnOn(n-2)
         turnOff(n-1) 
        }

我试着编写打开灯的算法,并想出了以下内容:

turnOn(n)
    if(n=1) turn on light 1
    else{
      if(n>2) turnOn(n-1)
      turn on n-1
      if(n>2) turnOff(n-2)
      turn on n
 }

但它不起作用。我不知道如何递归思考。我不知道我想要做些什么来解决它。

我的turnOn(3)给出了以下输出:

enter image description here

1 个答案:

答案 0 :(得分:1)

以下是打开奇数和偶数灯的测试用例:

3灯:

000

100

110

010

011

111

4灯:

0000

1000

1100

0100

0110

1110

1010

0010

0011

1011

1111

开启的算法:

  1. 始终先打开第一盏灯
  2. 然后打开第二盏灯
  3. 然后关闭第一盏灯以打开第三盏灯
  4. 打开第三盏灯
  5. 再次打开第一盏灯以转动第二盏灯
  6. 转动第二盏灯
  7. 关闭第一盏灯以打开第四盏灯
  8. 开启第四盏灯
  9. 我们的第一个目标始终是打开最后一盏灯。一旦它开启,我们就可以前进了。现在它。一旦最后一盏灯亮起,聪明的决定就不会在最后一盏灯前关灯。

    通过这种方式,我们一次可以从尾端打开2个灯。

    如果你有一定数量的灯,一次重复,你就可以打开k = 2灯,现在剩下n-k个灯。只要n-k = 0/1

    ,就重复这些n-k灯的过程

    如果n-k = 0,您的任务就完成了,所有灯都亮了。

    问题:

    如果n-k = 1,你会怎么做?很容易,只是想猜!