Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 21
  1. #11
    ogni giorno se ne scopre una ...

    a me la ricorsione lavora fino a 1588 ( PHP 5.1 Beta 3 ) , se metto 1589 non mi da la pagina ....


    pero' riguardo al tuo problema non e' con query in ricorsione che risolvi, stressi il server e basta.

    Prova a farci leggere un po' di codice spiegando bene cosa devi fare, magari risolviamo.



    P.S. PHP e' case-sensitive , non lo e' solo per le funzioni predefinite ( strlen o StrLen per intenderci sonola stessa cosa )






    Originariamente inviato da fabi080
    Qualsiasi cosa si può fare ricorsivamente si può anche fare iterativamente, per di più nella maggior parte dei casi con un'efficienza migliore, in quanto evita l'overhead delle chiamate a funzione.
    un linguaggio serio non dovrebbe avere overhead in ricorsione, in C arrivo a 12093810389832818310 chiamate in ricorsine con una valanga di operazioni e se la gode la ricorsione invece di respingerla .

    Questa cosa che il PHP ce l'ha ma limitata mi fa ridere ( per non piangere )
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #12
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    E comunque per curiosità ho scritto questa funzione
    Codice PHP:
    <?php
      $i 
    = (int) $_GET['id'];

        echo 
    "Fattoriale di ".$i." = ".factorial($i);

        function 
    factorial($n) {
        return (
    $n<=1) ? $n factorial($n-1);
      }
    ?>
    e fino a 10000 funziona egregiamente, poi sfancula abbastanza senza però dare l'errore che dici tu, semplicemente non restituisce nessun dato.

    Quindi molto probabilmente è vero che php ha un limite sulle ricorsioni.

    Il mio consiglio è di implementare quello che ti serve in maniera iterativa.

    Bye.

  3. #13
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    Originariamente inviato da andr3a
    un linguaggio serio non dovrebbe avere overhead in ricorsione, in C arrivo a 12093810389832818310 chiamate in ricorsine con una valanga di operazioni e se la gode la ricorsione invece di respingerla .

    Questa cosa che il PHP ce l'ha ma limitata mi fa ridere ( per non piangere )
    Non puoi paragonare php a C, semplicemente sono 2 universi differenti...

    E cmq l'overhead c'è eccome.

    Un pò di benchmark su un programma scemo che non fa altro che sommare

    Sorgenti versione iterativa:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]) {
      long long i=0, j=0, n = strtoll(argv[1], NULL, 10);
      for (i=0; i<n; i++) {
        j++;
      }
      printf("%lld\n", j);
    
      return 0;
    }
    versione ricorsiva:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    long long fact(long long i) {
      return (i<=1) ? 1 : 1 + fact(i-1);
    }
    
    int main(int argc, char *argv[]) {
      printf("%lld\n", fact(strtoll(argv[1], NULL, 10)));
      return 0;
    }
    e questi sono i tempi di esecuzione

    codice:
    [fabio@myproxy fact]$ time -p ./ric 209600
    209600
    real 0.04
    user 0.02
    sys 0.02
    [fabio@myproxy fact]$ time -p ./ite 209600
    209600
    real 0.00
    user 0.00
    sys 0.00
    Oltre 209600 la ricorsione non va se metto valori più alti va in segmentation fault, come arrivi tu a quel numero di chiamate ricorsive non lo saprei proprio, spero sia una numero buttato li tanto per dire.

    Mentre iterativamente non hai limiti:

    codice:
     
    [fabio@myproxy fact]$ time -p ./ite 4000000000
    4000000000
    real 32.98
    user 28.28
    sys 0.00

  4. #14
    nessun mistero:
    http://us3.php.net/manual/en/language.functions.php

    It is possible to call recursive functions in PHP. However avoid recursive function/method calls with over 100-200 recursion levels as it can smash the stack and cause a termination of the current script.

  5. #15
    Originariamente inviato da fabi080

    Oltre 209600 la ricorsione non va se metto valori più alti va in segmentation fault, come arrivi tu a quel numero di chiamate ricorsive non lo saprei proprio, spero sia una numero buttato li tanto per dire.
    ovvio che e' buttato li ... meno ovvio che oltre 209600 non va.

    Questo applicativo in ANSI C trova anche piu' di 8 alla 10 combinazioni ... fai tu i conti


    P.S. ... long long ... che e' ??? unsigned int o unsigned long no eh ? :master:


    comunque a livello teorico questi linguaggi ( C come PHP ) non dovrebbero avere limiti in ricorsione, proprio grazie all' esecuzione a pila ... ovviamnete e' evidente chela teoria fa cilecca
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #16
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    Questo applicativo in ANSI C trova anche piu' di 8 alla 10 combinazioni ... fai tu i conti
    E tu credi che faccia 8^10 chiamate ricorsive contemporaneamente ??

    Hai mai sentito parlare di backtracking, se fai un'affermazione del genere credo di no.

    Il programma che dici tu dal momento che fa un attacco di forza bruta (o quasi) su stringhe di lunghezza massima 8, ha al più 8 chiamate a funzione contemporaneamente sullo stack.

    P.S. ... long long ... che e' ??? unsigned int o unsigned long no eh ? :master:
    è ANSI C99 non l'ho inventato io... Volevo essere sicuro di non avere problemi di overflow, non ricordavo se long a 32bit o 64, allora per andare sul sicuro...

    Dalla documentazione di libc:
    CONFORMING TO
    strtol() conforms to SVID 3, BSD 4.3, ISO 9899 (C99) and POSIX, and
    strtoll() to ISO 9899 (C99) and POSIX 1003.1-2001.

    comunque a livello teorico questi linguaggi ( C come PHP ) non dovrebbero avere limiti in ricorsione, proprio grazie all' esecuzione a pila ... ovviamnete e' evidente chela teoria fa cilecca
    Beh il limite è pratico, non teorico ed è rappresentato dalla memoria a disposizione del processo...

  7. #17
    Utente di HTML.it L'avatar di ivy_76
    Registrato dal
    Dec 2004
    Messaggi
    1,822
    Ciao

    le vostre parole sono di conforto. E' da un mese che cerco di capire dove era il mio errore nel codice e ora finalmente ho la certezza che il problema sta nel PHP.
    condivido appieno chi dice che un problema sulla ricorsione è ridicolo per lo piu con solo 100 chiamate.
    Avevo gia postato il mio programma. Se volete questo è il precedente post da me inviato:

    http://forum.html.it/forum/showthrea...hreadid=865195
    TORTA DI RISO .. F I N I T A !!

    Da M.C.S.A. a impiegato pubblico :-(

  8. #18
    Utente di HTML.it L'avatar di fabi080
    Registrato dal
    Mar 2002
    Messaggi
    442
    Considera che puoi aumentare la quantità di memoria a disposizione di uno script con

    ini_set("memory_limit", valore_in_bytes);

    ma il mio consiglio rimane lo stesso, passa ad una implementazione iterativa.

  9. #19
    Originariamente inviato da fabi080
    E tu credi che faccia 8^10 chiamate ricorsive contemporaneamente ??

    Hai mai sentito parlare di backtracking, se fai un'affermazione del genere credo di no.

    Il programma che dici tu dal momento che fa un attacco di forza bruta (o quasi) su stringhe di lunghezza massima 8, ha al più 8 chiamate a funzione contemporaneamente sullo stack.
    e' uno studio sulla ricorsione basato su un esame di programmazione di Informatcia applicata scritto da me in ANSI C e non fa quello che pensi che fa perche' e' solo ricorsione su una funzione chiamata N volte per ogni N lunghezza stringa su ogni N numero di caratteri scelti per ogni N posizione carattere.

    Il limite di 8 non esiste per quel programma, l' ho messo io in questo eseguibile stand alone perche' l' originale non ha limiti, puo fare brute forcing anche fino a 100000^25 .

    Detto questo non so se sfruttta backtracking, quello che so e' che funziona in ricorsione e fa bene il suo lavoro, senza quel limite di soli 260.000 da te descritto.



    Originariamente inviato da fabi080
    Beh il limite è pratico, non teorico ed è rappresentato dalla memoria a disposizione del processo...
    che alloco dinamicamente e che non cresce comunque in modo esponenziale ( da qui deduco che ci sia backtracking ).

    Chiudo la parentesi, senno' andiamo OT
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #20
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657
    Originariamente inviato da ivy_76
    Ciao

    le vostre parole sono di conforto. E' da un mese che cerco di capire dove era il mio errore nel codice e ora finalmente ho la certezza che il problema sta nel PHP.
    condivido appieno chi dice che un problema sulla ricorsione è ridicolo per lo piu con solo 100 chiamate.
    Avevo gia postato il mio programma. Se volete questo è il precedente post da me inviato:

    http://forum.html.it/forum/showthrea...hreadid=865195
    allora proprio ti sei fissato ke php è buggato

    Effettivamente ho provato il tuo codice e si ferma a 1388 ricorsioni

    Codice PHP:
    function crea_Calendario($c)
    {
      for (
    $i=$c;$i<10000;$i++)
      {
       echo 
    "$i
    "
    ;
      }

    questo funge egreggiamente...

    perché fare 10000 ricorsioni che fanno impazzire il server, anziché fare un'iterazione che nn rompe le balline a nessuno ed è + semplice da implementare...



    E' poi questo nn è il forum adatto x parlare di c++

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.