Problem z rekurencja

Problem z rekurencja
Adrian P
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:5
0

Cześć, czy jest ktoś w stanie wyjaśnić mi dlaczego po wprowadzeniu liczby, która nie jest palindromem program przestaje działać?

Kopiuj
#include <iostream>
#include <string>
#include <sstream>
#include <stdlib.h>
using namespace std;
string str,rev;
int a,len,wynik;

int palindrom(int a)
{   
    //Zamiana int na string
    stringstream ss;
    ss<<a;
    ss>>str;
    len=str.length();//Długość stringa
    
    //Generowanie palindromu
    for(int i=len-1;i>=0;i--)
    {
       rev+=str[i];
    }
    //Sprawdzenie czy liczba jest palindromem
    if(str==rev) {return a;}
    else
    {
        a=atoi(rev.c_str());
        return palindrom(a);
    }
}


int main()
{
    cin>>a;
    cout<<palindrom(a);
    return 0;
}


lion137
A jaki jest komunikat?
Adrian P
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:5
0

Process terminated with status -1073741510

koffeina
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 5 lat
  • Postów:40
2

Bo jeśli wprowadzasz liczbę, która nie jest palindromem, to program w nieskończoność sprawdza, czy jednak nim nie jest, zamiast wrócić informację, że to nie jest palindrom.
Po co tutaj w ogóle rekurencja?

lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 minuty
  • Postów:4949
0

Tak pacze, co Tam sie dzieje w else, powiekszasz string o zero, konwertujesz do integera I wywolujesz rekurencyjnie. Niedobrze. Nie ma base case do rekurencji, bardzo zle.


kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Szczecin
2

Zastanówmy się co Twój program robi:

  • Jeśli liczba jest palindromem, zwracasz liczbę.
  • Jeśli nie jest, zwracasz wynik sprawdzenia, czy liczba zapisana od tyłu jest palindromem.

Na przykładzie 21.
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
21 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 12 jest palindromem:
12 nie jest palindromem, więc zwracamy wynik sprawdzenia czy 21 jest palindromem:
i tak dalej.


Pomijając powyższy problem

  1. Używaj zmiennych lokalnych, zamiast globalnych.
  2. Nie potrzebujesz kilku stringów aby sprawdzić czy string jest palindromem.
  3. C++ ma std::to_string i std::stoi

Adrian P
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:5
0

Sorki dopiero teraz zauważyłem błąd w kodzie. Jeśli liczba nie jest palindromem trzeba dodać początkową liczbę do tej odwróconej.
W kodzie powinno być
a=a+atoi(rev.c_str());
Mimo wszystko nadal ten sam problem występuje

edytowany 1x, ostatnio: Adrian P
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Szczecin
1

Prosta sprawa. rev jest zmienną globalną. Gdyby była lokalna, to byś dostawał "czystą" wartość przy każdym wejściu do funkcji.

https://wandbox.org/permlink/O40h9JUZ7ofvCfHB


edytowany 1x, ostatnio: kq
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 minuty
  • Postów:4949
0

Hej, nic nie trzeba dodawac, ty rekurencja nie jest potrzebna, a jak juz to wywoluje sie funkcje od pomniejszanych danych, zeby kiedys skonczyc.


SE
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:318
1

Ja bym jeszcze zapytał o to:

Kopiuj
int palindrom(int a)

Nie prościej użyć bool? Wtedy wystarczyło by zwrócić "czy ref jest równe str".

I jak wyżej, nie bardzo widzę tu zastosowanie dla rekurencji.
Nie mówiąc już o tym, że można nieco prościej sprawdzić "palindromowość":
https://stackoverflow.com/questions/8362572/check-if-a-string-is-palindrome

edytowany 2x, ostatnio: Serechiel
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Szczecin
1

Mam wrażenie że on chce dodać odwrócony zapis liczby do liczby i uzyskać w ten sposób palindrom. Np. 210 + 012 = 222.

Wtedy nawet jakiś sens w tym jest, chociaż nazwa funkcji słaba.
https://wandbox.org/permlink/slT2QGDN063sLNnZ


edytowany 1x, ostatnio: kq
Adrian P
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:5
0

Co prawda dzięki poradzie @kq program działa poprawnie, ale postaram się zrobić to bez rekurencji, bo rzeczywiście można. Zaczynam naukę programowania i chciałem gdzieś na siłę wcisnąć rekurencję. Dziękuję wszystkim za odpowiedzi.

Adrian P
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:5
0
kq napisał(a):

Mam wrażenie że on chce dodać odwrócony zapis liczby do liczby i uzyskać w ten sposób palindrom. Np. 210 + 012 = 222.
Dokładnie tak

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.