Procedura Rekurencji

NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Łódź
  • Postów:9
0

Cześć i czołem :)
Przede mną kolejne zadanie do wykonania w celach naukowych. Dopiero się uczę więc proszę o wskazówki :)
Muszę napisać procedurę (co ważne) na obliczanie silni z liczby podanej przez użytkownika.
Na formatce stworzyłem pole do wprowadzania liczby, przycisk liczący oraz pole wyświetlające wynik.
Powstał mi taki kod:

Kopiuj
procedure TForm1.Silnia_rek;

   begin
     n := StrToInt64(Edit_liczba.text);
     while (n > 1)  do
       begin
         silnia := n * silnia;
         n := n  -1;
     if (n = 1 ) then
       begin
          wynik := 1;
          Edit_wynikRek.text := IntToStr(wynik);
       end;
     end;
       wynik := silnia;
       Edit_wynikRek.text := IntToStr(wynik);
   end;            

Wynik zawsze pojawia się 0. Szczerze to chyba mózg mi się zaciął siedzę patrzę i nie mogę zrozumieć co robię źle ;/ Będę wdzięczny za pomoc!


Student informatyk lubiący wyzwania! :D
edytowany 1x, ostatnio: flowCRANE
SA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 14 godzin
  • Postów:1435
4

Po pierwsze odseparuj wprowadzanie danych od liczenia silni. Zadeklaruj funkcję i to jej wynik przypisuj do odpowiedniego TextBoxa.
I co tu ma wspólnego z rekurencją? Bez funkcji nie może być wywołania rekurencyjnego (o ile Lazarus/FP nie jest dziwniejszy pod tym względem, bo nie znam).

NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Lokalizacja:Łódź
  • Postów:9
0

@Saalin: Dziękuje mądra uwaga :)


Student informatyk lubiący wyzwania! :D
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Tuchów
  • Postów:12171
1
Saalin napisał(a):

Bez funkcji nie może być wywołania rekurencyjnego […]

Rekurancja to wywołanie danego podprogramu w jego własnym ciele, więc to prawda. Z drugiej strony, rekurencję można oprzeć na procedurze, czyli stworzyć procedurę rekurencyjną, która funkcją nie jest — i tu mamy nieprawdę. Ale że procedura to nic innego jak funkcja void, to jedynie pascalowa nomenklatura nie pasuje do cytowanego zdania, pomimo tego, że jest ono prawdziwe. ;)

Rekurencyjne mogą być też metody klas (te zwracające wartość lub tego nie robiące, czyli metody funkcyjne i proceduralne), zdarzenia też takie mogą być. Jednak zdarzenia nie służą do przeprowadzania obliczeń i ogólnie umieszczania logiki, więc takie kombinacje są raczej niemile widziane. Co nie zmienia faktu, że mogą działać rekurencyjnie.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.

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.