Problem z rekurencja

Odpowiedz Nowy wątek
2017-09-07 17:40
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;
}
A jaki jest komunikat? - lion137 2017-09-07 17:57

Pozostało 580 znaków

2017-09-07 17:59
0

Process terminated with status -1073741510

Pozostało 580 znaków

2017-09-07 17:59
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?

Pozostało 580 znaków

2017-09-07 18:02
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.


Pozostało 580 znaków

2017-09-07 18:02
kq
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

Pozostało 580 znaków

2017-09-07 18:03
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, 2017-09-07 18:05

Pozostało 580 znaków

2017-09-07 18:06
0

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


Pozostało 580 znaków

2017-09-07 18:06
kq
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, 2017-09-07 18:07

Pozostało 580 znaków

2017-09-07 18:09
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/que[...]eck-if-a-string-is-palindrome

edytowany 2x, ostatnio: Serechiel, 2017-09-07 21:17

Pozostało 580 znaków

2017-09-07 18:14
kq
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, 2017-09-07 18:16

Pozostało 580 znaków

2017-09-07 18:15
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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