next up previous contents
Nächste Seite: Die Ackermann-Funktion Aufwärts: Funktionen rekursiv verwenden Vorherige Seite: Die Hofstaedter-Funktion   Inhalt

Ulam-Zahlen

Der ungarische Mathematiker Ulam hat die nach ihm benannte Zahlenfolge folgendermaßen angegeben: Der erste Wert ist eine beliebige natürliche Zahl $n$. Ist diese Zahl gerade, so soll sie halbiert und als neuer Wert zurückgegeben werden. Ist die Zahl ungerade, wird sie mit 3 multipliziert, um 1 inkrementiert und dieses Ergebnis zurückgegeben. Die Folge endet, wenn die Zahl $1$ erreicht wurde. Man vermutet zwar, dass die Folge für alle natürlichen Zahlen abbricht (also $1$ erreicht), hat dies aber derzeit (2002) noch nicht beweisen können... Wir formulieren das Problem rekursiv:

public class Ulam{
    static int ulam(int n) {
        System.out.print(n + ", ");
        if (n==1) return 1;
        else {
            if ((n % 2) == 0) return ulam(n/2);
            else return ulam(3*n+1);
        }
    }

    public static void main(String [] args) {
        int maxzahl = Integer.parseInt(args[0]);
        ulam(maxzahl);
    }
}

Für die Zahlen 7, 11 und 13 erhalten wir beispielsweise:

alfred@duron:~/java/themen> java Ulam 7
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1,
alfred@duron:~/java/themen> java Ulam 11
11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1,
alfred@duron:~/java/themen> java Ulam 13
13, 40, 20, 10, 5, 16, 8, 4, 2, 1,

Für die Ulam-Zahlenfolge besteht (natürlich) eine sehr einfache iterative Lösung:

public class UlamIt {
    public static void main (String [] args) {
        int n = Integer.parseInt(args[0]);
        while (n!=1) {
            System.out.print(n + ", ");
            if ((n%2)==0) n /= 2;
            else n=n*3+1;
        }
        System.out.println(n);
    }
}



Alfred Nussbaumer 2003-02-10