2011-11-29 4 views
6

Devo ammettere, io non sono un esperto di matematica, ecco perché non posso risolvere il seguente problema per la mia soddisfazione.ciclo contare fino a 100 e di nuovo a 0 e fino a 100 di nuovo e così via

Ho un numero, dico i = 0. Ho una funzione che aumenta i su ogni chiamata di 1 e poi chiama di nuovo se stessa, aumentando di nuovo in un altro momento e un altro e un altro ... Quando raggiunta 100 voglio contare all'indietro a 0 e poi di nuovo in alto, un po 'come un endles loop con andare su e giù come un ascensore. Che cosa è una soluzione elegante per questo?

mia soluzione finora:

var countingUp = true; 
var i = 0; 

function count() { 
if(i < 100 && countingUp) {i+=1} 
if(i > 1 && !countingUp) {i-=1} 

if(i===100) {countingUp=false;} 
if(i===1) {countingUp=true;} 

count() 
} 
count() 

Sto cercando qualcosa di più breve.

+0

Ci dovrebbe (spero) sia un po 'di ritardo tra i conteggi? Altrimenti il ​​tuo ambiente si bloccherà. – RightSaidFred

+0

sì, non provare questo codice, è solo per mostrare l'idea. – Hans

risposta

6

sembra OK per me, ma probabilmente vendere il vostro cane in schiavitù e rubare la vostra birra:

var direction = 1; 
var i = 0; 

function count() { 
    i += direction; 
    direction *= (((i % 100) == 0) ? -1 : 1); 
} 
+0

sembra stretto, cosa fa% 100? – Hans

+1

Dividere per 100 e restituire il resto. – Arjan

+0

con questo codice produce " Uncaught SyntaxError: Token inaspettato) "una parentesi per molto ... direzione * = ((i% 100 == 0)? -1: 1) – Hans

3

Si può avere una variabile che aggiungere o diminuire la quantità se è positivo o negativo. Quindi dovrai solo cambiare il segno della variabile.

var countingUp = 1; 
var i = 0; 

function count() { 

    i += (1 * countingUp); 

    if (i == 100 || i == 0) 
    { 
     countingUp *= -1; 
    } 
} 

fiddle here.

per evitare di avere una ricorsione infinita, basta usare un setInterval().

window.setInterval(count, 1); 
+0

ricorsione infinita in là ... contare le chiamate Count chiamate ... –

+0

ricorsione infinita ... While ... stessa cosa per me (OK, non è la stessa cosa dal momento che i tempi di esecuzione JS non supportano la ricorsione in coda :() – hugomg

+0

@missingno basta usare setInterval ed evitare di chiamare la stessa funzione all'interno della stessa funzione ... controlla il mio violino modificato. –

1

Solo per divertimento:

function createCounter(min,max) { 
    var dir = -1, val = min; 
    return function() { return val += ((val >= max || val <= min) ? dir=-dir : dir); } 
} 

e poi di usarlo

var counter = createCounter(0,5); 
counter(); // 1 
counter(); // 2 
counter(); // 3 
counter(); // 4 
counter(); // 5 
counter(); // 4 
counter(); // 3 
counter(); // 2 
counter(); // 1 
counter(); // 0 
counter(); // 1 
counter(); // 2 
4

L'espressione abs((i % 200) - 100) rende il modello a dente di sega che si desidera man mano che aumenta.

Allora qualcosa di simile:

var i = 100; 
while (1) { 
    var j = Math.abs((i % 200) - 100); 
    // Use j 
    // ... 
    i += 1; 
}