【问题标题】:Is this the right way to solve this "oneFiveSeven" recursive question? (not looking to be efficient)这是解决这个“oneFiveSeven”递归问题的正确方法吗? (不希望有效率)
【发布时间】:2020-11-17 01:07:51
【问题描述】:

我需要在 Java 中编写一个名为“OneFiveSeven”的递归方法,它接收一个整数 (0

public static int oneFiveSeven(int n){
  if(n < 5){
    return n;
  }
  if(n == 5){
    return 1;
  }
  if(n == 7){
    return 1;
  }
  if( n % 7 + n / 7 < n % 5 + n / 5){
    return 1 + oneFiveSeven(n - 7);
  }
  return 1 + oneFiveSeven(n -5);
}

我不确定我的代码是否正确……你怎么看? (不寻找最佳复杂度)

【问题讨论】:

  • 您的代码似乎正确。

标签: java recursion computer-science


【解决方案1】:

您的代码对我来说很合适。

这是您解决方案的简单(但较慢)递归版本:

public static int oneFiveSeven(int n){
    if(n < 5) return n;
    if(n == 5) return 1;
    if(n == 6) return 2;
    if(n == 7) return 1;
    return Math.min(1 + oneFiveSeven(n - 7), 1 + oneFiveSeven(n - 5));
}

您可以利用动态规划来存储每个值的最佳可能性:

public class Main{
    public static int[] dp = new int[1000];
    
    public static void initDp(){
        dp[0] = 0; dp[1] = 1; dp[2] = 2; dp[3] = 3;
        dp[4] = 4; dp[5] = 1; dp[6] = 2; dp[7] = 1;
        for(int i = 8; i < 1000; i++) dp[i] = -1;
    }
    
    public static int oneFiveSeven(int n){
        if(dp[n] != -1) return dp[n];
        dp[n] = Math.min(1 + oneFiveSeven(n - 7), 1 + oneFiveSeven(n - 5));
        return dp[n];
    }
    public static void main(String[] args) {
        initDp();
        
        System.out.println(oneFiveSeven(10));
        System.out.println(oneFiveSeven(100));
        System.out.println(oneFiveSeven(999));
    }
}

输出

2 
16
143

【讨论】:

  • 我知道,并且我确实评估过......你可以看到我只减去 if(..) 发生,否则 - 5.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2011-11-23
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多