Visualizzazione risultati 1 fino 5 di 5

Discussione: Ciclo for con elevazione dinamica

  1. #1
    Guest

    Predefinito Ciclo for con elevazione dinamica

    Ho un problema nel fare un ciclo che mi mostri dinamicamente la lista di numeri che sono 2^x dove x = N > 0.

    Per ora ho:
    Codice PHP:
    for ($i = $v = 1; $i <= 8; $v = pow(2, $i), ++$i)
    Però se vado a stampare $v, ottengo:
    Codice:
    1 => 1
    2 => 2
    3 => 4
    4 => 8
    5 => 16
    6 => 32
    7 => 64
    8 => 128
    Se invece, faccio:
    Codice PHP:
    for ($i = $v = 1; $i <= 8; ++$i)
    {
    echo
    $i . ' => ' . pow(2, $i);
    }
    Ottengo:
    Codice:
    1 => 2
    2 => 4
    3 => 8
    4 => 16
    5 => 32
    6 => 64
    7 => 128
    8 => 256
    Usando il primo e stampando come il secondo aggiungendo la variabile $v (terzo valore), ottengo:
    Codice:
    1 => 2 => 4
    2 => 4 => 2
    3 => 8 => 4
    4 => 16 => 8
    5 => 32 => 16
    6 => 64 => 32
    7 => 128 => 64
    8 => 256 => 128
    Come posso fare per far si che il risultato sia come nel secondo caso e la variabile $v venga valorizzata nella definizione del for() e non al suo interno?

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,806

    Predefinito

    Però, il primo for effettua la pow() dopo aver fatto un echo di $i (quindi, la prima volta scrive 1).
    Invece, il secondo caso, fin dal primo ciclo effettua la pow, facendo iniziare da 2.

    Quindi, la "soluzione", può essere quella di inizializzare $i a 2.
    (Può sembrare banale e come dicevano i miei amici, "lo fai venire"...)

    Oppure, una cosa del genere (non so se ti va bene, visto che è valorizzata "al suo interno"):

    Codice PHP:
    for ($i = $v = 1; $i <= 8; ++$i)
    {
    echo
    $i . ' => ' . ($v = pow(2, $i));
    }
    Ciao!
    Ultima modifica di alemoppo : 22-09-2011 alle ore 19.00.19

  3. #3
    Guest

    Predefinito

    Il mio alla fine è un problema inutile diciamo, ma sono curioso di capirne il motivo. Posso benissimo valorizzare $v all'interno del ciclo, ma mi piacerebbe capire il perché e se posso farlo direttamente nella definizione del ciclo stesso.

    Modificando il codice e cambiando il valore di $i, non capisco perché all'inizio del ciclo, $v venga valorizzata sempre col valore di 4 se questa non è valorizzata all'inizio del ciclo, altrimenti prende il valore di $i iniziale.

    Valorizzando, invece, $v all'inizio del ciclo col primo valore che dovrebbe essere stampato, cioè 2, ottengo:
    Codice PHP:
    for ($i = 1, $v = 2; $i <= 8; $v = pow(2, $i), ++$i)
    Codice:
    1 => 2
    2 => 2
    3 => 4
    4 => 8
    5 => 16
    6 => 32
    7 => 64
    8 => 128
    Sembra sia corretto fare così:
    Codice PHP:
    for ($i = 1, $v = 2; $i <= 8; ++$i, $v = pow(2, $i))
    Codice:
    1 => 2
    2 => 4
    3 => 8
    4 => 16
    5 => 32
    6 => 64
    7 => 128
    8 => 256
    Ma non ne capisco il motivo: $v al primo ciclo dovrebbe essere $v = 2 ^ 1, poi il secondo $v = 2 ^ 2 dato che alla fine di ogni ciclo $i viene incrementato.

    Sbaglio io oppure no?

  4. #4
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,806

    Predefinito

    Io dicevo di inizializzare $i a 2...

    Comunque:

    $v al primo ciclo dovrebbe essere $v = 2 ^ 1, poi il secondo $v = 2 ^ 2
    No: al primo ciclo vale 1, perché l'assegnamento lo fa dopo aver eseguito un ciclo. Quindi all'inizio scrive il vero valore di $v.

    È un po come:

    Codice PHP:
    for($i=0;$i<8;$i++)
    echo
    $i;
    Secondo il tuo ragionamento, dovrebbe scrivere 1 2 3 4...; invece parte da 0.

    Ho capito il tuo problema?

    EDIT:

    Se vuoi, puoi usare il campo della condizione, visto che lo "esegue" "subito":
    Codice PHP:
    for ($i = 1, $v = 2; $i <= 8 && ($v = pow(2, $i)); ++$i)
    echo
    $v;
    Ciao!
    Ultima modifica di alemoppo : 22-09-2011 alle ore 19.33.09

  5. #5
    Guest

    Predefinito

    Ci sono arrivato dopo che ho postato la "soluzione". In ogni caso grazie per le delucidazioni

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •