Løsningsforslag - oppgaver i Avsnitt 1.5.5


Oppgave 2

  public static void perm(int[] a, int k)        // permuterer a[k:a.length>
  {
    if (k == a.length - 2) Tabell.skrivln(a);    // skriver ut
    else perm(a,k+1);                            // permuterer a[k+1:a.length>

    for (int i = k + 1; i < a.length; i++)
    {
      Tabell.bytt(a,k,i);                        // bytter om a[k] og a[i]
      if (k == a.length - 2) Tabell.skrivln(a);  // skriver ut
      else perm(a,k+1);                          // permuterer a[k+1:a.length>
      Tabell.bytt(a,k,i);                        // bytter tilbake
    }
  }

  //Generisk versjon

  public static <T> void perm(T[] a, int k, Oppgave<T[]> o)
  {
    if (k == a.length - 2) o.utførOppgave(a);    // utfører oppgaven
    else perm(a,k+1,o);                          // permuterer a[k:a.length>

    for (int i = k + 1; i < a.length; i++)
    {
      Tabell.bytt(a,k,i);                        // bytter om a[k] og a[i]
      if (k == a.length - 2) o.utførOppgave(a);  // utfører oppgaven
      else perm(a,k+1,o);                        // permuterer a[k+1:a.length>
      Tabell.bytt(a,k,i);                        // bytter tilbake
    }
  }  // perm

Oppgave 3

  public static <T> void permLeksikografisk(T[] a, int k, Oppgave<T[]> o)
  {
    if (k == a.length - 1) o.utførOppgave(a);
    else
    {
      for (int i = k; i < a.length; i++)
      {
        // bytter og holder det sortert fra i+1
        T temp = a[i];
        for (int j = i; j > k; j--) a[j] = a[j-1];
        a[k] = temp;
        permLeksikografisk(a,k+1,o);

        // flytter det tilbake slik det var
        temp = a[k];
        for (int j = k; j < i; j++) a[j] = a[j+1];
        a[i] = temp;
      }
    }
  }

  // Metoden kan kalles slik:

  Integer[] a = {1,2,3,4};
  permLeksikografisk(a, 0, p -> System.out.println(Arrays.toString(a)));

Oppgave 4

  public static <T> void perm2(T[] a, int n, Oppgave<T[]> o)
  {
    if (n == 1) o.utførOppgave(a);
    else
    {
      for (int i = 0; i < n; i++)
      {
        Tabell.bytt(a,i,n-1);
        perm2(a,n-1,o);
        Tabell.bytt(a,i,n-1);
      }
    }
  }

  // Metoden kan kalles slik:

  Integer[] a = {1,2,3,4};
  perm2(a, a.length, p -> System.out.println(Arrays.toString(a)));

Oppgave 5 - 10

Løsning mangler.