Corrigé examen « Concepts informatiques » 2013

Exercice 1

  1. Lignes : 2, 3, 8, 11, 15, 20, 21, 26, 33, 38
  2. void f(Bidule b), int f(int b), int []f(int []b), void main(String []args)
  3. Bidule@38e609c9
    Bidule@38e609c9
    2
    12
    12
    3
    3
    [I@68c884e 4
    [I@68c884e 4
    
  4. Oui cela change. En effet, la fonction renvoie un tableau créé lors de chaque appel à celle-ci. Par conséquent, la variable t1, au retour de la fonction, est affectée à l'adresse du nouveau tableau. Les deux dernières lignes de l'affichage sont de telle sorte que la seconde adresse est nécessairemetn different de la première. D'autre part, la valeur de la case d'indice 0 du tableau vaut 10, le tableau est créé avec des valeurs nulles en son sein, puisque la fonction ajoute 10 au contenu de la case d'indice 0, celle-ci contient désormais la valeur 10. Voici les deux dernière lignes de l'affichage :
    [I@68c884e 4
    [I@7448bc3d 10
    

Exercice 3

  1. Z(6)=Z(3)+Z(5)=Z(0)+Z(2) + Z(2)+Z(4)=1+1+1+Z(1)+Z(3)=3+1+Z(0)+Z(2)=4+1+1=6
  2. public class Zibo {
    	public static int zibonacci(int n) {
    		if (n<=2) return 1;
    		return zibonacci(n-3)+zibonacci(n-1);
    	}
    	public static void main(String []args) {
    		System.out.println(zibonacci(6));
    	}
    }
    
  3. public class ZiboMemoire {
            public static int zibonacci(int n,int []m) {
                    if (m[n]==0) {
                            if (n<=2) m[n] = 1;
                            else m[n] = zibonacci(n-3,m)+zibonacci(n-1,m);
                    }
                    return m[n];
            }
            public static int zibonacci(int n) {
                    int []memoireZibonacci = new int[n+1];
                    return zibonacci(n,memoireZibonacci);
            }
            public static void main(String []args) {
                    System.out.println(zibonacci(6));
            }
    }

Exercice 4

  1. f(9)=3*f(8)=3*2*f(6)=3*2*2*f(4)=3*2*2*2*f(2)=3*2*2*2*2*f(0)=3*2*2*2*2*1=48
  2. Dans sa forme d'origine elle n'est pas récursive terminale car entre le moment où l'on appelle récursivement f et le moment où l'on renvoie sa valeur, une opération (ici une multiplication) intervient.
  3.   public static int f(int n,int a) {
        if (n==0) return a;
        if (n%2==0) return f(n-2,2*a);
        else        return f(n-1,3*a);
      }
      public static int f(int n) {
        return f(n,1);
      }
    }
    
  4.   public static int f(int n) {
        int r = 1;
        while (!(n==0)) {
          if (n%2==0) {
            r = 2*r;
            n = n-2;
          }
          else {
            r = 3*r;
            n = n-1;
          }
        }
        return r;
      }