2016 – 1

Si consideri la seguente funzione:

int f1(int b1, int b2, int b3, int info)
{
   if(b1/b2 > b3) b3=b1*b2;
   if(b1/b3 > b2) b2=b1*b3;
   if(b2/b3 > b1) b1=b2*b3;
   if(b2/b1 > b3) b3=b1*b2;
   if(b3/b1 > b2) b2=b1*b3;
   if(b3/b2 > b1) b1=b2*b3;
   if(info == 1) return b1;
   if(info == 2) return b2;
   if(info == 3) return b3;
}

Cosa restituisce la funzione se chiamata sulla quaterna (4, 2, 0, 1) e sulla quaterna (4, 2, 0, 2)?

  1. rispettivamente 16 e 32
  2. rispettivamente 4 e 32
  3. errore, a causa di una divisione per 0
  4. rispettivamente 4 e 2

Risposta: 4 e 2.

Alla prima chiamata

f1(4, 2, 0, 1)

           4       2       0       1
int f1(int b1, int b2, int b3, int info)
{
   if(b1/b2 > b3) b3=b1*b2; // 4/2 > 0, 2 > 0, Sì, b3=4*2=8
   if(b1/b3 > b2) b2=b1*b3; // 4/8 > 2, 0 > 2, No
   if(b2/b3 > b1) b1=b2*b3; // 2/8 > 4, 0 > 4, No
   if(b2/b1 > b3) b3=b1*b2; // 2/4 > 8, 0 > 8, No
   if(b3/b1 > b2) b2=b1*b3; // 8/4 > 2, 2 > 2, No
   if(b3/b2 > b1) b1=b2*b3; // 8/2 > 4, 4 > 4, No
   if(info == 1) return b1; //         1 == 1, Sì, return 4
   if(info == 2) return b2;
   if(info == 3) return b3;
}

Alla seconda chiamata

f1(4, 2, 0, 2)

           4       2       0       2
int f1(int b1, int b2, int b3, int info)
{
   if(b1/b2 > b3) b3=b1*b2; // ...
   if(b1/b3 > b2) b2=b1*b3; // ...
   if(b2/b3 > b1) b1=b2*b3; // ...
   if(b2/b1 > b3) b3=b1*b2; // ...
   if(b3/b1 > b2) b2=b1*b3; // ...
   if(b3/b2 > b1) b1=b2*b3; // ...
   if(info == 1) return b1; //         2 == 1, No
   if(info == 2) return b2; //         2 == 2, Sì, return 2
   if(info == 3) return b3;
}