使用递归布尔方法的难度

时间:2017-01-16 02:39:32

标签: java recursion methods boolean

我试图通过使用递归算法来解决水手,猴子和椰子问题。如果有可能用给定的值解决问题,我希望我的程序声明为true或false。简而言之,问题是有些水手被困在一个有猴子和椰子的岛上。整个晚上,一名水手将醒来,拿着椰子切成均匀的堆,一只椰子留给猴子。然后水手将其中一个桩埋下来,并将另外两个桩堆放在一起。下一个水手醒来,并做同样的事情(为猴子留下一个甚至成堆,埋下其中一个桩,然后放回其他桩)。

我也知道2名水手需要7个椰子,3名水手需要79个椰子,4名水手需要1021个椰子。

我的基础案件有困难。如果我有一个案例,我有4名水手和81个椰子,我的程序会说它可能,因为4%81 = 1。然而,一旦第二个水手在这个例子中对椰子进行分类,就不足以进行排序。

非常感谢任何帮助或建议。非常感谢你!

public class test2 {

        public static void main(String[] args) {
            int sailors=4, sailorsRemaining=sailors, coconuts=81;
            testCoconuts(sailors, sailorsRemaining, coconuts);

         }//end main method

       public static boolean testCoconuts(int sailors, int sailorsRemaining, int coconutsRemaining){
            int s = sailors;
            int sr = sailorsRemaining;
            int cr = coconutsRemaining;

            if (cr%s==1 && sr==0) { //if there are enough coconuts to sort, but no sailors
              System.out.println("false1");
              return false;
           }

           else if (cr%s==1 && sr!=0) { //if there are enough coconuts and enough sailors to sort
            System.out.print("true1");
            return true;
          }

        if (cr%s!=1) { //if there are not enough coconuts to sort
            System.out.println("false2");
            return false;
        }
       else return testCoconuts(s, cr - ((cr-1)/s)-1, sr-1); //recursive step
    }

}//end class

2 个答案:

答案 0 :(得分:0)

你的方法接受(水手,水手剩余,椰子数),但你的返回方法发送(水手,椰子计数,剩下的水手)。你交换了订单。但仍然无法修复它。我重写了if语句,现在它可以正常工作了。我是通过回答以下问题来做到的:

  1. 如果我可以停止递归并返回true,那么必须满足哪些条件?
  2. 如果我可以继续递归,必须达到什么标准?
  3. 回答这两个问题,应该轻而易举地完成。调试对我来说是解决问题的关键。

答案 1 :(得分:0)

这个问题和数论有些关系。对于任何数量的水手,都有无数的解决方案。这个想法是找到最小的一个(椰子的数量)。

最终结果是产生一个方程和两个未知数的幂级数。幸运的是,它很容易在视觉上解决,因为两个大组件彼此相对。所以答案归结为以下几点:

满足 N 个水手的解的最小椰子数量是 N(N+1) - (N-1)

所以对于 3 个椰子 34 = 81 - 2 =79

因此,只需要一种方法来计算该值并适当地返回 true 或 false。

// all the following print true;
System.out.println(check(7,2));
System.out.println(check(79,3));
System.out.println(check(15621,5));
    
    
public static boolean check(int coconuts, int sailors) {
    return (int)Math.pow(sailors, sailors+1) - (sailors - 1) == coconuts;
}

请注意,这个问题有一个变体,当所有水手聚在一起做最后的划分时,没有余数(即猴子没有得到一个)。在这种情况下,解决方案是 NN - (N-1)