Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - problema con ricorsione
Forum - C/C++ - problema con ricorsione

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
andreapagani (Normal User)
Newbie


Messaggi: 2
Iscritto: 06/01/2020

Segnala al moderatore
Postato alle 14:31
Lunedì, 06/01/2020
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. char *cantor(char[], int, int);
  3.  
  4.  
  5. int main() {
  6.  
  7. char v[27];
  8.  
  9. for(int i = 0; i<27; i++){
  10. v[i] = ' ';
  11.  
  12. }
  13.  
  14. cantor( v, 0, 26);
  15.  
  16.  
  17.  
  18.  
  19. return 0;
  20. }
  21.  
  22. char *cantor(char str[], int posizioneInizioStringa, int posizioneFineStringa){
  23.  
  24. if(posizioneFineStringa == posizioneInizioStringa ){
  25. return str;
  26.  
  27. }
  28.  
  29. int a = (posizioneFineStringa + 1)/3;
  30.  
  31.  
  32. for(int i=0; i<a; i++){
  33. str = '#';
  34.  
  35. }
  36.  
  37. cantor(str, 0, a);
  38.  
  39. for(int i=a; i<2*a; i++){
  40. str = '.';
  41.  
  42. }
  43.  
  44. cantor( str, a, 2*a);
  45.  
  46. for(int i = 2*a; i<posizioneFineStringa; i++){
  47. str = '#';
  48. }
  49.  
  50. cantor(str, 2*a, posizioneFineStringa);
  51.  
  52.  
  53.  
  54. return str;
  55.  
  56. }



ho compilato questo codice ma mi dà thread exc bad access quando lo faccio andare, qualcuno sa aiutarmi?
qui sotto vi lascio il testo dell'esercizio

Una stringa (di lunghezza a piacere) che contiene solo caratteri ?#? e ?.? può essere una rappresentazione della così-detta polvere di Cantor (mono-dimensionale) se costruita nel modo seguente:
1. si pensa il numero di celle della stringa come diviso in tre parti, ciascuna della stessa lunghezza (a meno di un carattere in aggiunta o in difetto)
2. le celle delle parti a sinistra e a destra vengono riempite con caratteri ?#?
3. le celle della parte centrale vengono riempite con caratteri ?.?
4. Ciascuna parte contenente i ?#? viene modificata come descritto nei punti 1., 2., 3. (cioé divisa
in tre parti, con le parti esterne contenenti ?#? e quella centrale contenente ?.? ), ...., ricorsivamente fino ad arrivare ad avere "parti" composte da zero oppure una singola cella.
Esempio: un array di caratteri con 9 celle contenete polvere di cantor è: #.#...#.#
Scrivere sottoprogramma che, preso un array di caratteri, lo riempia come una stringa che rappresenta la
polvere di Cantor. Scrivere un programma main() che visualizza la stringa creata dal sottoprogramma. Suggerimento:
...Cantor(char str[],
int posizioneInizioStringa,
int posizioneFineStringa)

Ultima modifica effettuata da Thejuster il 08/01/2020 alle 12:14
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 15:25
Lunedì, 06/01/2020
Stai lavorando su un Array quindi riguardati il codice che hai scritto


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 15:26
Lunedì, 06/01/2020

Attendo la risposta dei Maestri :k:


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6380
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:44
Lunedì, 06/01/2020
Hai postato anche su iprogrammatori.it


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 21:47
Lunedì, 06/01/2020
Siccome la ricorsione mi fa sempre girare la testa, ho voluto cogliere la palla al balzo e cimentarmi con quest'esercizio.
L'ho risolto anche per le stringhe che hanno dimensioni che non siano potenze del tre, cosa che non ho ben capito se rientra nelle richieste della traccia o meno. La mia risoluzione dà uscite di questo genere:

Codice sorgente - presumibilmente Plain Text

  1. 01 char: #
  2. 02 char: ##
  3. 03 char: #.#
  4. 04 char: #..#
  5. 05 char: ##.##
  6. 06 char: ##..##
  7. 07 char: ##...##
  8. 08 char: #.#..#.#
  9. 09 char: #.#...#.#
  10. 10 char: #.#....#.#
  11. 11 char: #..#...#..#
  12. 12 char: #..#....#..#
  13. 13 char: #..#.....#..#
  14. 14 char: ##.##....##.##
  15. 15 char: ##.##.....##.##
  16. 16 char: ##.##......##.##
  17. 17 char: ##..##.....##..##
  18. 18 char: ##..##......##..##
  19. 19 char: ##..##.......##..##
  20. 20 char: ##...##......##...##
  21. 21 char: ##...##.......##...##
  22. 22 char: ##...##........##...##
  23. 23 char: #.#..#.#.......#.#..#.#
  24. 24 char: #.#..#.#........#.#..#.#
  25. 25 char: #.#..#.#.........#.#..#.#
  26. 26 char: #.#...#.#........#.#...#.#
  27. 27 char: #.#...#.#.........#.#...#.#
  28. eccetera...



...e va be'. Poi, però, ho cercato "polvere di cantor" su "Wikipedia" e ho trovato una definizione nella quale non si parla di vettori, bensì di matrici. In altre parole, si dice che la "polvere di cantor" è un costrutto bidimensionale (in effetti l'immagine illustrativa riporta un quadrato che contiene altri quadrati, come in una specie di "frattale" - non so niente sui frattali, quindi non so se ho usato la parola a sproposito).

Qual è l'interpretazione corretta?

Ultima modifica effettuata da AldoBaldo il 06/01/2020 alle 21:49


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
andreapagani (Normal User)
Newbie


Messaggi: 2
Iscritto: 06/01/2020

Segnala al moderatore
Postato alle 11:28
Martedì, 07/01/2020
mi manderesti il tuo codice Aldo baglio? perché a me dà un problema di segmentazione fault ma non capisco come risolverlo

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 20:41
Martedì, 07/01/2020
Lo farei anche, ma è vietato.

A me quel che (di solito) fa sbagliare i programmi che richiedono ricorsioni è l'impostazione delle condizioni di return, il che mi porta a "saturare" lo stack con dei crash a volte spettacolari! Per questo ho preso in considerazione il tuo esercizio: per fare esercizio.

Non so se la saturazione dello stack sia un problema anche del tuo codice (non l'ho provato).

Ultima modifica effettuata da AldoBaldo il 07/01/2020 alle 21:00


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 23:58
Martedì, 07/01/2020
Testo quotato

Postato originariamente da AldoBaldo:
Siccome la ricorsione mi fa sempre girare la testa, ho voluto cogliere la palla al balzo e cimentarmi con quest'esercizio.


L'ho pensato anche io ...
Testo quotato

Postato originariamente da AldoBaldo:
L'ho risolto anche per le stringhe che hanno dimensioni che non siano potenze del tre, cosa che non ho ben capito se rientra nelle richieste della traccia o meno. La mia risoluzione dà uscite di questo genere:

Codice sorgente - presumibilmente Plain Text

  1. 01 char: #
  2. 02 char: ##
  3. 03 char: #.#
  4. 04 char: #..#
  5. 05 char: ##.##
  6. 06 char: ##..##
  7. 07 char: ##...##
  8. 08 char: #.#..#.#
  9. 09 char: #.#...#.#
  10. 10 char: #.#....#.#
  11. 11 char: #..#...#..#
  12. 12 char: #..#....#..#
  13. 13 char: #..#.....#..#
  14. 14 char: ##.##....##.##
  15. 15 char: ##.##.....##.##
  16. 16 char: ##.##......##.##
  17. 17 char: ##..##.....##..##
  18. 18 char: ##..##......##..##
  19. 19 char: ##..##.......##..##
  20. 20 char: ##...##......##...##
  21. 21 char: ##...##.......##...##
  22. 22 char: ##...##........##...##
  23. 23 char: #.#..#.#.......#.#..#.#
  24. 24 char: #.#..#.#........#.#..#.#
  25. 25 char: #.#..#.#.........#.#..#.#
  26. 26 char: #.#...#.#........#.#...#.#
  27. 27 char: #.#...#.#.........#.#...#.#
  28. eccetera...




Si io ho fatto un po' di test, prima ho risolto la ricorsione del "cantor set" con le potenze di tre, dunque 3,9,27,81...
e i risultati vengono in linea con i tuoi
Poi ho giocato un po' con il codice per allineare i risultati in base alle richieste e prendendo spunto dai tuoi risultati ho tirato fuori 2 serie di risultati, uno lasciando l'algoritmo "base" e un secondo cercando di equilibrare i risultati per stringhe che no siano potenze di tre

Testo quotato

Postato originariamente da AldoBaldo:
...e va be'. Poi, però, ho cercato "polvere di cantor" su "Wikipedia" e ho trovato una definizione nella quale non si parla di vettori, bensì di matrici. In altre parole, si dice che la "polvere di cantor" è un costrutto bidimensionale (in effetti l'immagine illustrativa riporta un quadrato che contiene altri quadrati, come in una specie di "frattale" - non so niente sui frattali, quindi non so se ho usato la parola a sproposito).

Qual è l'interpretazione corretta?



Si ... quale è l'interpretazione corretta?? si lascia la ricorsione "base" oppure bisogna apportare piccole modifiche in base alle dimesioni della stringa?

Se serve a qualcuno posso postare il sorgente, non è C, ma Pascal, ma credo che cambia poco.

Un saluto


Ibis redibis non morieris in bello
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 0:33
Mercoledì, 08/01/2020
Piacerebbe anche a me che ci si potesse scambiare le risoluzioni senza troppi patemi, ma così non è. Magari un giorno si rivedrà quest'impostazione, non so, ma al momento il regolamento lo vieta. Io l'ho buttata lì, hai visto mai... :heehee:


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo