24
Opis zagadnieo 1 -3 Iteracja, rekurencja i ich realizacja

Opis zagadnień 1 -3

Embed Size (px)

Citation preview

Page 1: Opis zagadnień 1 -3

Opis zagadnieo 1 -3

Iteracja, rekurencja i ich realizacja

Page 2: Opis zagadnień 1 -3

Iteracja

Iteracja to czynnośd powtarzania (najczęściej wielokrotnego) tej samej instrukcji (albo wielu instrukcji) w pętli. Mianem iteracji określa się także operacje wykonywane wewnątrz takiej pętli

Page 3: Opis zagadnień 1 -3

Przykład iteracji

Czynnośd iteracji przedstawia pętla, zapisana w poniższym pseudokodzie: java:

i=0 int i=0;

dopóki i< 10 while(i<10) {

inkrementuj i i++;

przeskocz do góry }

W pierwszej iteracji otrzymamy wartośd i=1, w następnej i=2, potem i=3 i tak dalej, a iteracją jest powtarzana tu czynnośd, czyli zwiększanie zmiennej i o jeden.

Page 4: Opis zagadnień 1 -3

Rekurencja

Rekurencja (rekursja) jest podstawową techniką wykorzystywaną w językach programowania, dzięki której np. definicja lub funkcja może odwoład się do samej siebie. Programy rekurencyjne są często mniejsze i łatwiejsze do zrozumienia od ich iteracyjnych odpowiedników Nie wszystkie języki programowania mają możliwośd używania rekurencji. Przykładem jest np. COBOL

Page 5: Opis zagadnień 1 -3

Silnia

Przykład użycia silnia(3)

Silnia(3)

3*Silnia(2)

2*silnia(1)

1*silnia(0)

1

1*1

2*1

3*2

public int silnia(int x) { if(x==0) { return 1; } return x*silnia(x-1); }

Page 6: Opis zagadnień 1 -3

Ciąg Fibonacciego

F0 = 1 ; F1 = 1 ; Fn = Fn-1 + Fn-2

public int fib(int x) {

if(x<2) {

return 1;

}

return fib(x-1)+fib(x-2);

}

Page 7: Opis zagadnień 1 -3

Ciąg Fibonacciego - iteracja

package przyklad_1_fib; public class Przyklad_1_fib { public static void main(String[] args) { int liczba = 80; System.out.println( "Wynik dla liczby " + liczba + ": " + fib_i(liczba) ); } public static long fib_i(int n) { long a = 0, b = 1; for(int i=0;i<n;i++) { b += a; //pod zmienną b przypisujemy wyraz następny czyli a+b a = b-a; //pod zmienną a przypisujemy wartośd zmiennej b } return b; } }

Page 8: Opis zagadnień 1 -3

Ciąg Fibonacciego - rekurencja

package przyklad_1_fib; public class Przyklad_1_fib { public static void main(String[] args) { int liczba = 80; for(int i = 0; i <= 80 ; i++) { System.out.println( "Wynik dla liczby " + i + ": " + fib_r(i) ); } } public static long fib_r(int n) { if(n < 2) return 1; return fib_r(n-1) + fib_r(n-2); } }

Page 9: Opis zagadnień 1 -3

Problemy rekurencji

Najwięcej problemów związanych z rekurencją wiąże się z ograniczeniami stosu wywołao, a właściwie jego pojemności. Na stosie są odkładane kolejne wywołania danej metody i dopiero gdy dojdziemy do ostatniego elementu dane te są zbierane – bardzo łatwo więc o sytuację, gdy po prostu stos przepełnimy.

Page 10: Opis zagadnień 1 -3

Instrukcja warunkowa switch - case

Instrukcja warunkowa wielokrotnego wyboru na podstawie tylko jednej zmiennej.

Switch( zmienna ) {

case 0: zmienna++; break;

default: zmienna+=2; break;

}

Page 11: Opis zagadnień 1 -3

Instrukcja warunkowa if

if [else if] [else] Pozwala zmienid przebieg wykonywania kodu w zależności od wartości logicznej wyrażenia: if (warunek) { //instrukcje } else if (warunek) { //instrukcje } else { //instrukcje }

Page 12: Opis zagadnień 1 -3

Operator trójargumentowy

Konstrukcja:

wyrażenie ? Prawda : fałsz ;

Przykład:

Person p = new Person();

int tmp = p.isEmployed() ? p.getSalary() : 0;

Page 13: Opis zagadnień 1 -3

Pętla for

• Konstrukcja: for(i; warunek koncowy; operacje na i) Gdzie i to licznik petli, a operacje na i to zazwyczaj zwiększanie/zmniejszanie o 1.

• Dzięki swojej konstrukcji pozwala np na łatwe przechodzenie po tablicach/listach

• Pozwala na łatwe przejście po zakresie liczb np.: 10 – 50 lub 50 – 10

• Warunek jest sprawdzany na początku pętli • Pętla wykonuje się dopóki zachodzi dany warunek

Page 14: Opis zagadnień 1 -3

For - przykład

int suma = 0;

for(int i=0;i<10;i++) {

suma += i;

}

Page 15: Opis zagadnień 1 -3

For - przykład

package przyklad_1_fib; public class Przyklad_1_fib { public static void main(String[] args) { int suma = 0; for(int i=0; i<20 && i%5==0 ;i+=2) { if( i % 5 == 0) suma += i; } System.out.println(suma); } }

Page 16: Opis zagadnień 1 -3

Pętla foreach

• Odmiana pętli for, wykonująca się dla każdego elementu z pewnego zbioru/kolekji.

• Konstrukcja: for(element : zbior)

• W każdej iteracji ‚element’ będzie kolejnym elementem zbioru.

Page 17: Opis zagadnień 1 -3

Foreach – przykład

List<Person> persons = new ArrayList<Person>();

//wypełnianie tablicy persons

Foreach(Person p : persons) {

//instrukcje na p

}

Page 18: Opis zagadnień 1 -3

Pętla while

• Konstrukcja: while(wyrazenie) { //instrukcje }

• Wykonuje się dopóki dane wyrażenie zwraca true

• Warunek jest sprawdzany na początku pętli

Page 19: Opis zagadnień 1 -3

Pętla while - przykład

Int k = 100;

while(k <= 1000000000) {

//instrukcje

k *= 10;

}

Page 20: Opis zagadnień 1 -3

Pętla do-while

• Konstrukcja: do { //instrukcje } while(wyrazenie);

• Wyrażenie sprawdzane jest po każdej iteracji

• Zatem pętla wykona się przynajmniej raz

Page 21: Opis zagadnień 1 -3

Podprogram

• Podprogram (inaczej funkcja lub procedura) – termin związany z programowaniem proceduralnym. Podprogram to wydzielona częśd programu wykonująca jakieś operacje. Podprogramy stosuje się, aby uprościd program główny i zwiększyd czytelnośd kodu

Page 22: Opis zagadnień 1 -3

Sposoby przekazywania parametrów

• Przekazywanie przez wartośd.

• Przekazywanie przez wynik.

• Przekazywanie przez referencję.

• Przekazywanie przez nazwę.

Page 23: Opis zagadnień 1 -3

Przykład przekazywania przez wartośd

#include <iostream> using namespace std; void zmien_x(int x) { x *=2; cout << "X z procedury " << x << endl; } int main() { int x = 4; zmien_x(x); cout << "X z main " << x << endl; return 0; }

Page 24: Opis zagadnień 1 -3

Przykład przekazywania przez referencję

#include <iostream> using namespace std; void zmien_x_2(int & x) { x *= 2; cout << "X z procedury " << x << endl; } int main() { int x = 4; zmien_x_2(x); cout << "X z main " << x << endl; return 0; }