У меня есть двоичная последовательность, которая следует специфической логике таким образом, что она начинается с 0
иDetect я члена двоичной последовательности
го члена = последовательность (п-1) -й термин + 0
+ обратными (задним ходом (п-1) -го члена)
например:
0
0 + 0 + 1
001 + 0 + 011
0010011 + 0 + 0011011
Здесь, мне нужно выяснить, п-й член последовательности -го.
Мое мнение:
Я написал рекурсивную функцию для вычисления числа членов в последовательности k-го
public static long noOfElements(long elements){
long answer;
if(elements == 1)
return 1;
else
answer = 1 + 2*noOfElements(elements-1);
return answer;
}
После анализа я выяснил последовательность следует определенной схеме, то k'th последовательность может быть разбита наполовину и переключить значения 0 и 1, я мог бы отслеживать результат.
Итак, моя функция ниже нарушает заданную последовательность вплоть до [0,0,1] рекурсивно
public static long letsBegin(long reqd, long length){
long mid = (length + 1)/2;
if(length <= 3){
return reqd;
}else{
if(reqd > mid){
reqd = reqd - 2*(reqd-mid);
switcher(); //Switcher stores if the value is switched
return letsBegin(reqd, mid);
}else{
return letsBegin(reqd, mid);
}
}
}
В конце концов у меня есть индекс 1, 2 или 3 в [0,0,1] и Я вывожу значение соответствующим образом. Проблема здесь
- Это не удается для неизвестного случая (возможно, моя логика ошибочна).
- Число последовательностей может быть до 50, что делает число элементов = 1125899906842623 и, следовательно, занимает слишком много времени для вывода значения (> 2сек) Что может быть не так? Неправильно ли моя логика
Рекурсия вызывает переполнение стека для больших входов: -/ –
@ Rockstar как получается? Вы сказали, что у вас будет более 50 последовательностей. Обратите внимание, что в 63 последовательностях позиция больше не может вписываться в 'long', и вам нужно будет использовать« BigInteger »или что-то для представления позиции. Также этот метод выделяет мало места на стеке, вам понадобится как минимум тысячи рекурсивных вызовов на обычном компьютере, чтобы вызвать какие-либо проблемы. – kajacx
Да, это не более 50 последовательностей, без. элементов 1125899906842623, для ввода k = 50, n = 1125899906842622 сбой программы с переполнением стека в 'if (n