2010-07-01 12 views
26

hej szukam są czyste rozwiązanie tego problemu:zapętlenie w dwóch kierunkach

alt text

i uruchomić pętlę z i = 0 w drugim etapie pętli i = 1, następnie i = -1 a następnie i = 2 ect.

jak to zaprogramować za pomocą pętli for w czysty sposób?

+0

Od poprosić o konkretnej implementacji, co język pracujesz w? –

+0

php lub js byłoby w porządku – antpaw

Odpowiedz

11

Jeśli nie przeszkadza posiadające wewnętrzną pętlę pojawiają się 3 razy:

f(0); 
for (var i = 1; i <= 3; ++ i) { 
    f(i); 
    f(-i); 
} 

2 razy z if:

for (var i = 0; i <= 3; ++ i) { 
    f(i); 
    if (i > 0) 
    f(-i); 
} 

jeden raz, ale z brzydkiego wyrażenia:

for (var j = 1; j <= 7; ++ j) { 
    var i = j/2; 
    if (j % 2) i = -i; 

    f(i); 
} 
+1

dziękuję, najbardziej lubię wersję "brzydka ekspresja" :) – antpaw

+0

@antpaw whhhhhyyyyyyyyy? Poza tym, że jest najbrzydszy, jest najbardziej zawiły i nieefektywny pod względem przetwarzania. – stinky472

+0

+1. Kolejne możliwe rozwiązanie, a może nawet być wymagane, jeśli nie mamy dostępu losowego, ale tylko dwukierunkowy dostęp do połączonej listy, np. Użyć dwóch iteratorów (jeden z nich zmniejsza się, inne zwiększają się i uzyskują dostęp do pierwszego elementu z początek). – stinky472

27
f(0); //do stuff with 0 

for(var i = 1; i<len; i++) //where len = positive boundary 
{ 
    f(i); //do stuff with i 
    f(-i); //do stuff with -i 
} 

Powinieneś zrobić, co chcesz

+0

+1 dla elegancji w formie; możesz wyodrębnić funkcję do_stuff w oddzielnej funkcji, aby uniknąć powielania kodu, ale poza tym jest całkiem piękna. –

+1

+1, dla uproszczenia –

+0

-1, dla uproszczenia – mario

5

Każda pętla, wydajesz się dodawać n*(-1)^(n+1), gdzie n jest krokiem, który obecnie bierzesz, zaczynając od 1 i zaczynając od i = 0.

initialize i = 0 
n=0, i+=0*(-1)^1 # 0 
n=1, i+=1*(-1)^2 # 1 
n=2, i+=2*(-1)^3 # -1 
n=3, i+=3*(-1)^4 # 2 

itp

Stąd, to zależy od tego, co językiem chcesz pisać. Iteracyjne od n = 0 gdziekolwiek jesteś zatrzymanie.

edytuj to jest zła odpowiedź. ale zabawa = D

(I dodał, że ostatni bit, ponieważ tak szybko, jak zrobiłem to zmienił, ktoś mnie downvoted =()

+0

+1 To była moja natychmiastowa myśl o odpowiedź również :) – NibblyPig

3

Oto implementacja w javascript

for (var i = 0; Math.abs(i)<10; i=(i<=0?Math.abs(i)+1:-i)) { 
    console.debug(i) 
} 

Nadzieję, że to pomaga.

+0

hehe ładne umiejętności :) – antpaw

+0

zmniejszyć swoje uzależnienie od matematyki, wykonując 'i = 0; i <10;i=(i<=0> 1-i: -i)' – fbstj

1
 for (int i = 0; i < 10; i++) 
     { 
      int div = i/2; 
      int mod = i % 2; 

      int offset = mod == 0 ? div : -div; 
     } 
2

że użyto funkcji sinus:

for ($i = 0; $i < 10; $i++) 
{ 
    echo round(0.5 * $i * sin((0.5 + $i) * M_PI))."\n"; 
} 
0

Modyfikacja spadającego rozwiązania pocisku, które obsłuży skrzynkę indeksową 0 bez specjalnego warunku.

//do stuff with 0 
for(int i = 0; i< (arrayLength/2); i++) 
{ 
    //do stuff with i 

    if(-i != i) 
    { 
     //do stuff with negIndex 
    } 
} 
1

Istnieje wzór do tej pętli.Patrząc na to na osi liczbowej - to idzie tak:

  • 0 kroków wstecz
  • 1 krok naprzód
  • 2 kroki do tyłu
  • 3 kroki do przodu
  • 4 kroki do tyłu

Oto jedno rozwiązanie - zwiększaj wielkość kroku w każdej iteracji pętli i zmieniaj kierunek (do przodu/do tyłu) za każdym razem. Kontynuuj dodawanie do bieżącej wartości.

// n is the number of elements to generate 
for(var i = 0, value = 0, dir = -1; i < n; i++) { 
    value = value + (dir * i); 
    console.log(value); 
    dir = dir * -1; // reverse direction 
} 

Innym rozwiązaniem użyciu generators w JavaScript 1.7, który jest identyczny jak na solution @ FallingBullet ale bardziej estetycznie do mojego oka :)

function sequence() { 
    var i = 0; 

    yield i; 

    while(true) { 
     i++; 
     yield i; 
     yield -i; 
    } 
} 


var seq = sequence(); 
seq.next(); // 0 
seq.next(); // 1 
seq.next(); // -1 
seq.next(); // 2 
... 
0

w C. Wartość N jest całkowitą liczba wartości w sekwencji, którą chcesz uzyskać.

int i, n = 0, m = 1; 
for (i = 1; i < N; i++, m = -m) { 
    /* n is the next in the sequence */ 
    n += m * i; 
} 
3

tylko jeden Ponadto jeden odejmowania i negacji:

for(int i=0, d=1, f=-1; i<10; i+=d, d=f-d, f=-f) 
{ 
    printf("%d\n", i); 
} 

generuje wewnętrzną pętlę:

push  esi 
push  offset string "%d\n" (0D20F4h) 
call  dword ptr [__imp__printf (0D20A4h)] 
mov   eax,ebx 
add   esi,edi 
sub   eax,edi 
add   esp,8 
neg   ebx 
mov   edi,eax 
cmp   esi,0Ah 
jl   wmain+10h (0D1010h) 
1

Na co warto, tu jest moja własna interpretacja problemu.

for (var i = 0; i > -8; i = (i<=0) - i) // arbitrary condition stops loop at -8 
0

pewnie bym go z:

for (var i = 0; i <= max; i = (i <= 0) ? -i + 1 : -i) 
{ 
    f(i); 
} 
Powiązane problemy