Я пытаюсь немного изучить Java самостоятельно, и обычно у меня более чем достаточно ресурсов с такими хорошими сайтами, как этот, но теперь я просто хочу знать, в чем я ошибаюсь.
Итак, проблема была сформулирована так:
Следующая итерационная последовательность определена для набора натуральных чисел:
n → n / 2 (n четно) n → 3n + 1 (n нечетно)
Используя приведенное выше правило и начиная с 13, мы генерируем следующую последовательность:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1. Видно, что эта последовательность (начиная с 13 и заканчивая 1) содержит 10 членов. Хотя это еще не доказано (задача Коллатца), считается, что все стартовые номера заканчиваются на 1.
Какое начальное число меньше миллиона дает самую длинную цепочку?
ПРИМЕЧАНИЕ. После запуска цепочки разрешено превышать один миллион терминов.
Я продолжаю получать эти java.lang.StackOverflowError, может кто-нибудь мне помочь. Мой код:
import java.util.HashMap;
public class Euler
{
HashMap<Integer,Integer> check;
int result;
public Euler()
{
check = new HashMap<Integer,Integer>();
}
public int search(int number)
{
int startingNumber = number;
while (check.get(number)==null && number!=1){
if (number%2==0){
number = number / 2;
result = search(number);
result++;
}
else {
number = (3*number)+1;
result = search(number);
result++;
}
}
if (check.get(startingNumber)!=null){
result=result+check.get(number);
check.put(startingNumber,result);
}
else{
check.put(startingNumber,result);
}
return result;
}
public int test()
{
int temp = 0;
int highest=0;
int get = 0;
for (int i=1000001;i>1;i--){
result = 0;
temp = search(i);
if(temp>highest){
highest=temp;
get = i;
}
System.out.println(i);
}
return get;
}
}
РЕДАКТИРОВАТЬ:
public class Euler
{
public Euler()
{
}
public int quickSearch(int numb)
{
int steps = 0;
while (numb != 1) {
if (numb % 2 == 0) {
numb /= 2;
}
else {
numb = 3 * numb + 1;
}
steps++;
}
return steps;
}
public int test()
{
int temp = 0;
int highest=0;
int get = 0;
for (int i=1;i<1000001;i=i+2){
temp = quickSearch(i);
if(temp>highest){
highest=temp;
get = i;
}
System.out.println(i);
}
return get;
}
}
EDIT2: Итак, в коде версии EDIT у меня завис компьютер, но когда я изменил int на long, он работал отлично, хотя я понимаю, что с некоторой картой для хранения значений вы можете найти его быстрее. Спасибо вам всем !!