这是解决此“ oneFiveSeven”递归问题的正确方法吗? (效率不高)

时间:2020-07-27 16:45:50

标签: java recursion computer-science

我需要用Java编写一个称为“ OneFiveSeven”的递归方法,该方法接收一个整数(0 <= n)并返回最小的加数,以便将(int n)表示为一个,五个和七的。 例如:oneFiveSeven(10)= 2、5 + 5。

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);
}

我不确定我的代码是否正确...您怎么看? (不是在寻找最佳的复杂性)

1 个答案:

答案 0 :(得分:0)

您的代码对我来说正确。

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

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