Zadania 2 – Badanie poprawności semantycznej algorytmu

Transkrypt

Zadania 2 – Badanie poprawności semantycznej algorytmu
Zadania 2 – Badanie poprawności semantycznej algorytmu
1. Dany jest następujący algorytm obliczający wartości wyrażenia 32n – 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 32n – 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 22n – 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 22n – 1
4. Dany jest następujący algorytm obliczający wartości wyrażenia 33n – 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 33n – 2
5. Dany jest następujący algorytm obliczający wartości wyrażenia 54n – 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 33n – 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ń
}