Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

Program obliczający wartość silni



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Algorytmy + inżynieria oprogramowania
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Matii
Gość





PostWysłany: Sro Cze 20, 2018 8:33 am  OP    Temat postu: Program obliczający wartość silni Odpowiedz z cytatem Pisownia

Witajcie

Napisałem małe proste programiki obliczający silnie. W tym jakże małych programikach drzemie olbrzymia moc pod postacią rekurencji, którą staram się lepiej zrozumieć :). Być może, ktoś mi pomoże lepiej zrozumieć rekurencję, której ja tak do końca nie rozumiem :(.

Pierwszy programik obliczający silnię napisałem metodą iteracyjną :)
Kod:
Program Silnia_Niereku;
var
   i,silnia: integer;
begin
     silnia := 1;
     for i := 1 to 7 do
        begin
             silnia := silnia * i;
             writeln('Silnia z ',i,' wynosi: ',silnia)
        end
end.


Drugi programik obliczający silnie napisałem przy użyciu procedury rekurencyjnej :)
Kod:
uses Crt;
var
   wynik, ilosc_wywolan: integer;
procedure Silnia(var liczba,n: integer);
begin

     n := n + 1;
     liczba := liczba * n;
     writeln('Silnia z ',n,' wynosi: ',liczba);

     if n < 7 then
       Silnia(liczba,n);


     writeln('Poziom wywołania: ',n);
     n := n - 1
end;

begin
     wynik := 1; ilosc_wywolan := 0;
     ClrScr;
     Silnia(wynik, ilosc_wywolan)
end.

Trzeci programik obliczający silnie napisałem przy użyciu funkcji rekurencyjnej :)
Kod:
uses Crt;
var
     ilosc: integer;
function Silnia(var n: integer): integer;
var
   l: integer;
begin
     if n > 1 then
       begin
            l := n;
            n := n - 1;
            Silnia := Silnia(n) * l
       end
     else
         Silnia := 1
end;

begin
     ilosc := 7;
     ClrScr;
     writeln('Silnia z ',ilosc,' wynosi: ',Silnia(ilosc))
end.

Problem polega na tym, że w trzecim programiku jak do zmiennej ilosc przypisuje wartości od zera do siedmiu, to wszystko działa ok, ale jak chcę już to zrobić w pętli, żeby wyświetliło wartości silni od 0 do 7 to pętla zacina się przy drugiej iteracji :(. Czyli
Kod:
ilosc := 7; { i kolejno podstawiam  6, 5, 4, 3, 2, 1, 0 - to jest git :) }
     ClrScr;
     writeln('Silnia z ',ilosc,' wynosi: ',Silnia(ilosc))

{ natomiast nie działa tak jak pisałem wcześniej coś takiego
    
    ilosc := 7;
    ClrScr;
    for i := 0 to ilosc do
        writeln('Silnia z ',i,' wynosi: ',Silnia(i))

Czy ktoś by mi zechciał bardziej dokładniej wytłumaczyć to całą rekurencję ?
Jak też dlaczego mi się pętla zacina skoro przy podstawianiu pojedynczych wartości wszystko działa, ok ? }



Pozdrawiam Matii i czekam na odpowiedź :).
Powrót do góry
Matii
Gość





PostWysłany: Sro Cze 20, 2018 9:13 pm  OP(?)    Temat postu: Odpowiedz z cytatem Pisownia

Do administratorów forum. Znalazłem błąd i już pojąłem czym jest rekurencja, więc możecie usunąć mój post.
Powrót do góry
hurgadion



Dołączył: 06 Kwi 2011
Posty: 853
Skąd: Web :)

PostWysłany: Pią Cze 22, 2018 9:10 am      Temat postu: Odpowiedz z cytatem Pisownia

o ile Administratorzy nie usuną, to mały komentarz... pisanie rekurencyjne nie jest zbyt modne, większość kodu pisze sie w pętlach, jednak za pomocą rekurencji kody stają się krótsze czasem i to znacznie... tego typu kodowanie używa się w programowaniu funkcyjnym (np. ML, Haskell, Oz, Dr Racket, i inne)... tę wygodę zauważył twórca języka Scala (Martin Odersky), w którym można programować zarówno objektowo (ten język wykorzystuje możliwości Javy) jak i funkcyjnie... także są odpowiednie narzędzia do wykorzystania programowania równoległego i wykorzystania możliwości Sparka przy większej ilości danych... także w sumie chyba polecam...

a Twój kod można opisać w skrócie tak:
Kod:

function silnia(n):
    if n==0:
        return 1
    return n*silnia(n-1)


Pozdrawiam...

_________________
miasto nauki praktycznej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora Numer GG
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Algorytmy + inżynieria oprogramowania Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.12678 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |