Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: [C] divide et impera

  1. #1
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892

    [C] divide et impera

    Ciao raga, eccomi alle prese con un altro problema. Devo definire una funzione RICORSIVA esisteOK che determina se l'array contiene la sequenza ok, cioe' 'o' seguito da 'k'.

    Il prototipo della funzione e`: int esisteOK(char v[], int inf, int sup) e devo utilizzare la tecnica ricorsiva del DIVIDE ET IMPERA!!!
    ma non so come c.... si fa!!
    cioè ho provato ma nn mi viene ! potete darci un occhio? grazie!

    codice:
    int esisteOK(char v[],int inf,int sup){
      int i,med,e1,e2;
      if (inf==sup)
        return 0;
      else if (inf!=sup)
      {
         med=(inf+sup)/2;
         if ((v[inf]=='o')&&(v[sup]=='k'))
           printf("\n");
           return 1;
      }
      else{ 
           e1=esisteOK(v,inf,med);
           e2=esisteOK(v,med+1,sup);
           if ((e1)>=(e2))
             return 1;
      }      
    }
    cosa sbaglio?? nn riesco mai a capire quale è il caso base!!!

    grazie mille raga!
    Debian Sarge 3.01a
    Slackware 10.2

  2. #2
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    il caso base sarà

    if inf = (sup - 1)
    (
    if v[inf]=='o' AND v[sup]=='k'
    hai trovato l'ok e esci
    else
    non hai trovato l'ok e esci
    )
    else
    (
    chiamate ricorsive
    )
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  3. #3
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892
    gentilmente puoi spiegarmi perchè??

    grazie Marco!!!
    Debian Sarge 3.01a
    Slackware 10.2

  4. #4
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892
    allora ho riscritto il codice secondo le tue indicazioni ma pare che si blocchi e il disco continua a macinare per niente...!
    ecco :

    codice:
    int esisteOK(char v[],int inf,int sup){
      int i,med,e1,e2;
      if (sup==-1){
       if ((v[inf]=='o')&&(v[sup]=='k'))
         return 1;
       else return 0;
      }
      else{ 
         med=((inf+sup)/2);
         e1=esisteOK(v,inf,med);
         e2=esisteOK(v,med+1,sup);
         if ((e1)>=(e2))
           return 1;
      }      
    }
    cosa cè adesso che non va??
    Debian Sarge 3.01a
    Slackware 10.2

  5. #5
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    hai messo un if e la funzione non ritornava il risultato se la condizione era falsa
    med=((inf+sup)/2);
    e1=esisteOK(v,inf,med);
    e2=esisteOK(v,med+1,sup);
    return e1 + e2;
    dovrebbe funzionare, e1 e e2 sono o 0, 0 o 0, 1 o 1, 0

  6. #6
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892
    no non funziona niente...io devo trovare la sequenza.. io per sequenza intendo 2 lettere attaccate (di posto i e i++ per capirci).

    cosa sbaglio??
    Debian Sarge 3.01a
    Slackware 10.2

  7. #7
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    if (sup < inf+2) {
    if ((v[inf]=='o')&&(v[inf+1]=='k'))
    return 1;
    else return 0;
    }

  8. #8
    io devo trovare la sequenza.. io per sequenza intendo 2 lettere attaccate (di posto i e i++ per capirci).
    Non e' cio' che hai scritto nel tuo programma: la 'o' la cerchi nell'estremo inferiore e la 'k' in quello superiore...
    Folle e' l'uomo che parla alla luna.
    Stolto chi non le presta ascolto.

  9. #9
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Questa dovrebbe funzionare:

    Codice PHP:
    int esiste_OK(char a[], int infint sup){
        if(
    sup <= inf)
            return -
    1;
        
    int med = (inf sup) / 2;
        if((
    a[med] == 'o') && (a[med 1] == 'k'))
            return 
    med;
        
    int temp esiste_OK(ainfmed);
        if(
    temp > -1)
            return 
    temp;
        return 
    esiste_OK(amed 1sup);

    bada che non restituisce 0 o 1 ma ti dà l'indice della posizione dela prima occorrenza trovata di "ok", mentre dà -1 se "ok" non è presente, così puoi verificare meglio se lavora correttamente. Bada inoltre che va invocata come esiste_OK(a, 0, 20) se l'array 'a' ha 21 posizioni.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  10. #10
    Utente di HTML.it L'avatar di Fabiuz
    Registrato dal
    Nov 2004
    Messaggi
    892
    si ma io devo usare il divide et impera (o Command and Conquer come lo vuoi chiamare....) e cosi in quel modo non posso confrontare i risultati delle due metà degli array! Purtroppo....


    miii perchè non mi funge ancoraa???
    nella maniera che ho avevo fatto io il pc si impalla e non capisco perchè......................


    Debian Sarge 3.01a
    Slackware 10.2

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 © 2025 vBulletin Solutions, Inc. All rights reserved.