我写了一个代码来计算长度的总和
syra(1) = 1syra(2) = n + syra(n/2) if n%2==0syra(3) = n + (n*3) + 1
例如。

  • syra(1)将生成1个
  • syra(2)将生成2 1
  • syra(3)将生成3 10 5 16 8 4 2 1
  • lengths(3)将是所有syra(1),syra(2),syra(3)的总和,即11。

  • 这是代码:
    public static int lengths(int n) throws IllegalArgumentException{
      int syra = n;
      int count = 0;
      int sum = 0;
      if (syra < 1){
        throw new IllegalArgumentException("Value must be greater than 0");
      }else{
        for (int i=1; i<=syra; i++){
          count = i;
          sum++;
          while (count > 1){
            if ((count % 2) == 0){
              count = count / 2;
              sum++;
            }else{
              count = (count * 3) + 1;
              sum++;
            }
          }
        }
      }
      return sum;
    }
    

    问题是,如果我炸破具有较大值的长度,例如700000,将花费很长时间,并对那些已经出现在syra(3)中的syra(10),syra(5)...重复执行步骤。

    如何微调代码以存储重叠序列的某些温度(数组)?

    好的,根据信息,这是我对数组进行的另一个修改后的代码,为什么它会产生数组索引超出范围的错误?
    public class SyraLengths{
    
    public static void main (String[]args){
        lengths(3);
    }
    
    public static int lengths(int n) throws IllegalArgumentException{
        int syra = n;
        int count = 0;
        int sum = 0;
        int [] array = new int [syra+1];
        array[0] = 0;
        if (syra < 1){
            throw new IllegalArgumentException("Value must be greater than 0");
            }else{
    
    
                    for (int i=1; i<=syra; i++){
                        count = i;
                        sum++;
    
                        while (count > 1){
    
                            if(array[count] !=0){sum = sum + array[count];}
    
                            else if ((count % 2) == 0){
                                count = count / 2;
                                array[count]=sum;
                                sum++;
                            }else{
                                count = (count * 3) + 1;
                                array[count]=sum;
                                sum++;
    
                                }
                            }
                    }
                }return sum;
    }
    

    }

    最佳答案

    使用HashMap<Integer, Integer>存储您已经计算出的结果,并在尝试重新计算结果之前在其中查找值。此技术称为memoization

    关于java - 创建一种有效的求和方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7648357/

    10-08 21:52