[Pascal] Podzielność przez 3 rekurencyjnie


(Clank) #1

Witam,

Mam problem z programem, ponieważ wydaje mi się, że wszystko jest dobrze, natomiast gdy go uruchamiam, wywala błąd przepełnienia stosu. Nie mam pomysłu co jest nie tak więc wrzucam swój kod i proszę o pomoc. :slight_smile:

program podzielnosc_przez_3;

var a:integer;

function sumacyfr (a:word) :word;

begin

sumacyfr:=((a mod 10) + sumacyfr(a div 10)) mod 3;

end;

begin

a:=45;

sumacyfr(a);

{if sumacyfr(a)=0 then writeln ('jest podzielna')

else writeln ('nie jest podzielna');}

readln;

end.

(Grzelix) #2

dawno nie pisałem w Pascalu (jeśli w ogóle bo nie mogę sobie przypomnieć kiedy) ale ta linijka

sumacyfr:=((a mod 10) + sumacyfr(a div 10)) mod 3;

a dokładnie zmienna o nazwie sumacyfr wygląda podejrzanie. Natomiast po nieco dłuższej analizie kodu to nie widzę zakończenia się tej funkcji rekurencyjnej. Zazwyczaj jest taki fragment który zwraca wartość końcową i nie wywołuje dalej funkcji. W tym przypadku coś takiego:

if( a mod 10 == 0) return a;

(Rolek0) #3

Rekurencja powinna się kiedyś kończyć :stuck_out_tongue:

function sumacyfr(a:word) : word;

begin

	if a < 10 then

		sumacyfr := a

	else

		sumacyfr := (a mod 10) + sumacyfr(a div 10);

end;

Dawno nie pisałem w pascalu więc może nie być całkiem dobrze


(Clank) #4

Faktycznie, głupi błąd zrobiłem, dzięki Wam obu no i dzięki temu wreszcie zrozumiałem rekurencje :wink: