Der ungarische Mathematiker Ulam hat die nach ihm benannte Zahlenfolge folgendermaßen angegeben: Der erste Wert ist eine beliebige natürliche Zahl . 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 erreicht wurde. Man vermutet zwar, dass die Folge für alle natürlichen Zahlen abbricht (also 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); } }