我写了一个代码来计算长度的总和syra(1) = 1
syra(2) = n + syra(n/2) if n%2==0
syra(3) = n + (n*3) + 1
例如。
这是代码:
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/