Ripubblicato da Stack Overflow - Penso che questo è un posto più appropriato per porre la domanda.
Ho un algoritmo che per un intero x
e un intero iniziale i
tale che 1 < i
< x
il successivo valore di i
è calcolato da i = floor(x / i) + (x mod i)
. Questo continua fino a raggiungere un i
che abbiamo già visto.
In JavaScript (anche se questa domanda è indipendente dal linguaggio):
function f(x, i) {
var map = {};
while(!map[i]) {
map[i] = true;
i = Math.floor(x / i) + (x % i); // ~~(x / i) is a faster way of flooring
}
return i;
}
Posso provare che alla fine raggiungeremo un i
che abbiamo già visto, ma mi chiedo:
- C'è un modo più efficiente di calcolare il prossimo
i
? - (Ancora più importante) Esiste un modo per calcolare l'ennesimo
i
senza eseguire il ciclon
volte?
Giusto per chiarire - So che ci sono modi più veloci di usare le mappe hash JS per quel controllo, e che il pavimento può essere sostituito dalla divisione intero in altre lingue. Ho fatto entrambe le ottimizzazioni, ma le ho lasciate fuori per cercare di rendere il codice più facile da capire.