Есть задача 14 из проекта Эйлера.
Суть задачи есть следующая повторяющаяся последовательность определена для множества натуральных чисел:
n → n/2 (n - чётное)
n → 3n + 1 (n - нечётное)
Какой начальный элемент меньше миллиона генерирует самую длинную последовательность?
Решение задачи рекурсионное. В рамках канала
https://www.youtube.com/watch?v=mHbgWHqeBp0 (да качество пока ужасное) я сделал сравнение производительности в решении данной задачи на Python/LUA (код не буду приводить он примерно такой же как и JS)
console.time('coll');
function getCollatz(number, iterations=1){
if (number===1){
return iterations
} else if (number % 2 === 0){
return getCollatz(Math.floor(number/2), iterations+1)
} else {
return getCollatz(3*number+1, iterations+1)
}
}
let a = 0;
let x = 0;
let y = 0
for (let i = 1; i< 1000001; i++){
let current_iter = getCollatz(i);
if (current_iter>a){
a = current_iter;
x = i
}
y++
}
console.timeEnd('coll')
console.log(x)
Цифры получились такие:
- Python: 59 сек
- Lua: 17 сек
Для меня пока без сюрпризов, но JS на NodeJS справился за
2 секунды!!!!
Собственно вопрос - почему?
P.S. Все 3 теста на одной и той же машине