【问题标题】:Easter egg recursive function on javajava上的复活节彩蛋递归函数
【发布时间】:2016-04-04 10:54:55
【问题描述】:

我被分配了一个java作业任务,它涉及一个复活节彩蛋游戏,当我给你n个鸡蛋时开始,当你剩下正好m个鸡蛋时结束。在游戏的任何阶段,假设你还剩n个鸡蛋,那么你可以回馈一些鸡蛋,但你必须遵守以下规则:

• 如果 n 是偶数,那么您可以返还正好 n/2 个鸡蛋。

• 如果 n 可以被 3 或 4 整除,那么您可以将 n 的最后两位数相乘并返回 很多鸡蛋。

• 如果 n 能被 5 整除,那么您可以返还正好 m 个鸡蛋。

• 如果n 是一个素数,那么你可以只返还一个鸡蛋。

我必须编写一个名为 picnic 的函数,如果通过以某种顺序应用规则,我们还剩下 m 个鸡蛋,它将返回 true;否则为假:

public static boolean picnic(int n, int m) { … }

我的任务是:

a) 提供 picnic(int n, int m) 的递归关系

b) 使用递归关系在 Java 中实现递归函数

c) 为 picnic(250, 42) 开发完整的递归调用树

d) 这里的递归模式是什么? (尾递归与否?树还是线性递归?)

e) 这个函数是否提醒了任何算法设计策略?如果有,是哪一个?

我已经完成了问题 a) 的回答:

public class EasterEggs {   
    public static boolean picnic (int n, int m) {
        if (n == m)
        return true;
        else return (picnic(n,m));
    }
}

而且我不确定如何实现递归函数。我尝试了几次,但仍然没有。

问题 b 和 c 是我最大的问题 atm,我确信我可以弄清楚 d 和 e。有人可以帮我解决这个问题吗?并可能告诉我如何实现它?

【问题讨论】:

  • 如果 n!=m 递归永远不会终止(导致溢出)。
  • @blazs 那是因为代码只回答 a) 而不是(还)b)
  • 您对 picnic 的递归调用,必须将 n 替换为小于 n 的数字。为此,请应用每条可能的规则,并在应用规则后对剩余的号码使用 picnic。此外,您应该检查 n 时的情况
  • 规则相互冲突:例如,如果 n 可以被 4 整除,那么它也是偶数,而 5 是可以被 5 整除的素数。你是否应该在规则?

标签: java algorithm recursion tail-recursion recurrence


【解决方案1】:

在递归关系中,我们不必像您在问题中提到的那样定义类和方法。这是树递归而不是尾递归。 而这个功能让我们想起了回溯设计策略。

对于 b) 部分,我的解决方案是简单而蛮力。

public class EasterEggs {   
    public static boolean picnic (int n, int m) {
      if (n == m)
        return true;
      if(n < m)
        return false;

      boolean result = false;

      if(n%2 == 0)
         result = picnic(n-n/2,m);
      if((n%3 == 0 || n%4 == 0) && (result == false))
         result = picnic(n-lastTwoDigitMultiply(n),m);
      if(n%5 == 0 && (result == false))
         result = picnic(n-m,m);
      if(isPrime(n) && (result == false))
         result = picnic(n-1,m);

      return result;  
    }
}

【讨论】:

    【解决方案2】:

    你必须:

    创建一个代表您的不同规则的枚举(其中有 4 个:p)。让我们承认您将枚举命名为 ERule

    使用 args 创建递归函数

    • 剩余的鸡蛋(最初 == n)

    递归函数beeing的退出条件:

    • n = m(真)
    • n
    • 没有规则可以应用于 n (false)

    如果不满足退出条件,则只需为可应用于当前 n 的每个规则调用递归函数(根据您测试的条件在修改后的 n 值上调用它)。结果是对所有结果的 OR 语句。

    【讨论】:

      【解决方案3】:

      返回给定数组是否可整是最好的函数

      /* 样本数据

      • {3, 3, 6, 36} 3
      • {4} 2
      • {3, 4, 3, 6, 36} 3
      • {6、12、24、36} 12
      • {} */

      公共类 IsDivisible {

      public static void main(String[] args) {
      
          int[] sampleData = { 3, 3, 6, 36 };
          int divisible = 3;
      
          int result = isDivisible(sampleData, divisible);
          System.out.println(result);
      
      }
      
      static int isDivisible(int[] givenArray, int isDivisible) {
      
          for (int i = 0; i < givenArray.length; i++) {
      
              if ((givenArray[i] % isDivisible) != 0) {
      
                  return 0;
      
              }
          }
      
          return 1;
      }
      

      }

      【讨论】:

      • 请编辑您的答案格式并添加一些解释
      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多