Problem z rekurencja

0

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

#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;
}


0

Process terminated with status -1073741510

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?

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.

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
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

0

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

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

1

Ja bym jeszcze zapytał o to:

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

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

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.

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1