Zadania 2 – Badanie poprawności semantycznej algorytmu
1. Dany jest następujący algorytm obliczający wartości wyrażenia 32n – 4. Udowodnij indukcyjnie jego poprawnośd względem warunku początkowego i koocowego .
int Potega_dwa(int n)
{ // : n 1
if(n==0) return -1;
if(n==1) return 2;
return 3*Potega_dwa(n-1)-2*Potega_dwa(n-2);
} // : wartością funkcji jest 32n – 4
2. Dany jest następujący algorytm obliczający wartości wyrażenia 2n + 2. Udowodnij indukcyjnie jego poprawnośd względem warunku początkowego i koocowego .
int Potega_dwa(int n)
{ // : n 0
if((n==0)||(n==1)) return n+3;
return 3*Potega_dwa(n-1)-2*Potega_dwa(n-2);
} // : wartością funkcji jest 2n + 2
3. Dany jest następujący algorytm obliczający wartości wyrażenia 22n – 1. Udowodnij indukcyjnie jego poprawnośd względem warunku początkowego i koocowego .
int Potega_dwa(int n)
{ // : n 0
if((n==0)||(n==1)) return 2n+1;
return 3*Potega_dwa(n-1)-2*Potega_dwa(n-2);
} // : wartością funkcji jest 22n – 1
4. Dany jest następujący algorytm obliczający wartości wyrażenia 33n – 2. Udowodnij indukcyjnie jego poprawnośd względem warunku początkowego i koocowego .
int Potega_trzy(int n)
{ // : n 0
if((n==0)||(n==1)) return 6n+1;
return 4*Potega_trzy(n-1)-3*Potega_trzy(n-2);
} // : wartością funkcji jest 33n – 2
5. Dany jest następujący algorytm obliczający wartości wyrażenia 54n – 3. Udowodnij indukcyjnie jego poprawnośd względem warunku początkowego i koocowego .
int Potega_cztery(int n)
{ // : n 0
if((n==0)||(n==1)) return 15n+2 else
return 5*Potega_cztery(n-1)-4*Potega_cztery(n-2);
} // : wartością funkcji jest 33n – 2
13. Udowodnid za pomocą indukcji, że podany niżej algorytm sprawdzania, czy element x jest w drzewie binarnym, przy przeglądaniu drzewa metodą inorder, jest semantycznie poprawny, względem warunku początkowego alfa i koocowego beta.
struct element {
int wartosc;
element *pien;
element *konar_lewy;
element *konar_prawy;
}
typedef element, *el_drzewa;
int inorder (el_drzewa korzen, int x) {
//{alfa: korzen !=NULL}
int pom=0;
if ((*korzen).konar_lewy!=NULL)
pom=inorder((*korzen).konar_lewy,x);
if (pom) return 1;
else
if ((*korzen).wartosc==x) return 1;
if ((*korzen).konar_prawy!=NULL)
pom=inorder((*korzen).konar_prawy,x);
if (pom) return 1;
else return 0;
//{beta: funkcja zwraca 1, gdy "x jest elementem drzewa"}, // zwraca 0, gdy "x nie jest elementem drzewa".}
}
14. Udowodnid za pomocą indukcji, że podany niżej algorytm sprawdzania, czy element x jest w drzewie binarnym, przy przeglądaniu drzewa metodą postorder, jest semantycznie poprawny, względem warunku początkowego alfa i koocowego beta.
struct element {
int wartosc;
element *pien;
element *konar_lewy;
element *konar_prawy;
}
typedef element, *el_drzewa;
int postorder (el_drzewa korzen, int x) {
//{alfa: korzen !=NULL}
int pom=0;
if ((*korzen).konar_lewy!=NULL)
pom=postorder((*korzen).konar_lewy,x);
if (pom) return 1;
else
if ((*korzen).konar_prawy!=NULL)
pom=postorder((*korzen).konar_prawy,x);
if (pom) return 1;
if ((*korzen).wartosc==x) return 1;
else return 0;
//{beta: funkcja zwraca 1, gdy "x jest elementem drzewa"}, // zwraca 0, gdy "x nie jest elementem drzewa".}
}
15. Obliczyd pesymistyczną i średnią złożonośd obliczeniową następującego algorytmu, obliczającego, czy podana liczba x znajduje się w tablicy (w zależności od n):
const n=10;
int tab[n]={1,2,3,2,-7,44,5,1,0,-3};
int szukaj(int tab[n], int x)
{//funkcja zwraca indeks poszukiwanego elementu x int pos=0;
while ((pos<n)&&(tab[pos]!=x)) pos++;
if(pos<n) return pos; //element został znaleziony else return -1 //porażka poszukiwań }