<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://zumunterrichten.idea-sketch.com/index.php?action=history&amp;feed=atom&amp;title=Java%2FUlam-Folge</id>
	<title>Java/Ulam-Folge - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://zumunterrichten.idea-sketch.com/index.php?action=history&amp;feed=atom&amp;title=Java%2FUlam-Folge"/>
	<link rel="alternate" type="text/html" href="https://zumunterrichten.idea-sketch.com/index.php?title=Java/Ulam-Folge&amp;action=history"/>
	<updated>2026-05-08T22:58:11Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in ZUM-Unterrichten</subtitle>
	<generator>MediaWiki 1.39.15</generator>
	<entry>
		<id>https://zumunterrichten.idea-sketch.com/index.php?title=Java/Ulam-Folge&amp;diff=99150&amp;oldid=prev</id>
		<title>Matthias Scharwies: Artikel von Claus Schmitt, importiert aus ZUM-Classic</title>
		<link rel="alternate" type="text/html" href="https://zumunterrichten.idea-sketch.com/index.php?title=Java/Ulam-Folge&amp;diff=99150&amp;oldid=prev"/>
		<updated>2019-08-25T04:57:09Z</updated>

		<summary type="html">&lt;p&gt;Artikel von Claus Schmitt, importiert aus ZUM-Classic&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Wenn [[BenutzeR:CSchmitt|ich]] mir vornehme, eine neue Programmiersprache zu lernen, bin ich oft enttäuscht, wenn es dann am Anfang nur für das [[Java/Erste_Schritte#Hallo-Welt-Programm|&amp;quot;Hallo Welt&amp;quot;]]-Programm reicht … &lt;br /&gt;
&lt;br /&gt;
Das Problem bei der Einführung ist meist, dass der Autor genug mit den Besonderheiten der Syntax und der Benutzeroberfläche zu tun hat, so dass das Problem eher dienenden Charakter hat. In Wirklichkeit sind Programmiersprachen aber nur ein (austauschbares, dienendes) Werkzeug, um Probleme zu lösen. &lt;br /&gt;
&lt;br /&gt;
Lassen Sie uns also ein Problem in den Mittelpunkt und die technischen Randbedingungen zurück stellen!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Fortsetzung|&lt;br /&gt;
vorher=Erste Schritte|vorherlink=Java/Erste Schritte|&lt;br /&gt;
weiter=Die Monte-Carlo-Methode&amp;lt;br&amp;gt; zur Bestimmung der Kreiszahl|weiterlink=Java/Monte-Carlo-Methode|&lt;br /&gt;
übersicht=Einstieg in Java&amp;lt;br&amp;gt;(Übersicht)|übersichtlink=Java#Übersicht|}}&lt;br /&gt;
&lt;br /&gt;
== Ulam-Folge ==&lt;br /&gt;
&lt;br /&gt;
Wir beginnen tatsächlich mit einem &amp;quot;phänomenalen Problem&amp;quot;, die {{wpde|Ulam-Folge}}:&lt;br /&gt;
&lt;br /&gt;
* Wähle als Startzahl n eine beliebige natürliche Zahl.&lt;br /&gt;
* Für gerades &amp;lt;code&amp;gt; n &amp;lt;/code&amp;gt; entsteht das nächste Element der Folge, indem man &amp;lt;code&amp;gt; n &amp;lt;/code&amp;gt; halbiert.&lt;br /&gt;
* Für ungerades &amp;lt;code&amp;gt; n &amp;lt;/code&amp;gt; muss man &amp;lt;code&amp;gt; n &amp;lt;/code&amp;gt; entsprechend verdreifachen und dann 1 addieren.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bekanntlich (aber bis heute nicht bewiesen) hat sich durch ausgiebiges Testen ergeben, dass es für jede Startzahl&amp;lt;code&amp;gt; n &amp;lt;/code&amp;gt; ein letztes Folgenglied gibt, und zwar 1  !!!&lt;br /&gt;
&lt;br /&gt;
Obiges Ulam-Verfahren terminiert also jeweils, und das wäre in der vermuteten Allgemeingültigkeit eine wesentliche Bedingung für einen Algorithmus.&lt;br /&gt;
&lt;br /&gt;
=== Vom Algorithmus zum Programm ===&lt;br /&gt;
&lt;br /&gt;
Lassen Sie uns ein [[Algorithmus#Struktogramm|Struktogramm]] entwickeln für diesen &amp;quot;Algorithmus&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Struktogramm-Ulam.svg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Box|Arbeitshinweis|# Untersuchen Sie, wie dieses Struktogramm in Java-Quelltext übertragen wird.&lt;br /&gt;
# Lassen Sie sich von fremdartigen Begriffen nicht irritieren, sondern versuchen Sie nur die Zusammenhänge mit dem Struktogramm zu entdecken.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Ulam  {&lt;br /&gt;
	public static void main (String[] args)  {	      &lt;br /&gt;
	  int n = 13;&lt;br /&gt;
	  System.out.println(n);&lt;br /&gt;
	  while(n != 1) {&lt;br /&gt;
	     if(n % 2 == 0)  n = n / 2;&lt;br /&gt;
	     else            n = 3*n + 1;&lt;br /&gt;
	     System.out.println(n);   &lt;br /&gt;
	  }&lt;br /&gt;
     }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ergibt sich folgende Ausgabe:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ulam-Folge-1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Mit &amp;lt;code&amp;gt;n % 2&amp;lt;/code&amp;gt;  wird der {{wpde|Division_mit_Rest#Modulo|Modulo-Operator}} verwendet; &amp;lt;code&amp;gt;n % 2&amp;lt;/code&amp;gt; liefert also den Rest bei Ganzzahldivision durch 2.&amp;lt;br&amp;gt;z.B. &amp;lt;code&amp;gt;13 % 2 = 1&amp;lt;/code&amp;gt;       und   &amp;lt;code&amp;gt;13 / 2 = 6&amp;lt;/code&amp;gt;&lt;br /&gt;
* Die Mengenklammern markieren Blöcke, wie man sie z.B. von der &amp;quot;BEGIN END Klammerung&amp;quot; bei Pascal kennt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dateneingabe ===&lt;br /&gt;
Da es unpraktisch ist, den Startwert &amp;lt;code&amp;gt; n &amp;lt;/code&amp;gt; immer neu zu editieren, sieht man eine kommandozeilenorientierte Eingabe vor:&lt;br /&gt;
&lt;br /&gt;
Die aktuellen Parameter werden als Zeichenketten gelesen; nach  einer Leerstelle folgt der nächste Parameter; auf den ersten  greift man über &amp;lt;code&amp;gt;args[0]&amp;lt;/code&amp;gt; zu; mit Konvertierungsfunktionen kann man geeignete Übergabewerte in Zahlen umwandeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Ulam  {&lt;br /&gt;
	public static void main (String[] args)  {&lt;br /&gt;
          //Der erste Parameter hat die Nummer 0&lt;br /&gt;
	    int n = Integer.parseInt(args[0]); &lt;br /&gt;
          //Die While-Schleife klammert einen Block von Anweisungen&lt;br /&gt;
	    while(n != 1) {      &lt;br /&gt;
	      if(n % 2 == 0)               &lt;br /&gt;
		  n = n / 2;                 &lt;br /&gt;
		else                         &lt;br /&gt;
		  n = 3*n + 1;               &lt;br /&gt;
		System.out.printf(&amp;quot;%d,  &amp;quot;,n);    &lt;br /&gt;
	    }&lt;br /&gt;
              //im Formatstring ist %d ein Platzhalter für eine ganze Zahl&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/source&amp;gt;                                          &lt;br /&gt;
&lt;br /&gt;
Liefert mit dem aktuellen Parameter 27:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ulam-Folge-2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Formatierung ===&lt;br /&gt;
Zur vernünftigen Darstellung der Ulam-Folge fehlt jetzt nur noch eine geeignete Formatierung:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Ulam  {&lt;br /&gt;
  public static void main (String[] args)  {&lt;br /&gt;
    int n = Integer.parseInt(args[0]);&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    while(n != 1) {&lt;br /&gt;
     //Index für das Ulam-Folgenglied&lt;br /&gt;
     i = i +1;                       &lt;br /&gt;
     if(n % 2 == 0)    &lt;br /&gt;
         n = n / 2;&lt;br /&gt;
     else    &lt;br /&gt;
        n = 3*n + 1;&lt;br /&gt;
     // 7 Plätze für jede Zahl&lt;br /&gt;
     System.out.printf(&amp;quot;%7d,&amp;quot;,n); &lt;br /&gt;
     // Zeilenwechsel immer nach 10 Zahlen  &lt;br /&gt;
     if (i%10 == 0 )&lt;br /&gt;
        System.out.println();      &lt;br /&gt;
    }&lt;br /&gt;
        // Schleife beendet  &lt;br /&gt;
   //%n steht für einen Zeilenwechsel                               &lt;br /&gt;
   System.out.printf(&amp;quot;%n%nDiese Ulamfolge umfasst %d Zahlen.%n&amp;quot;,i); &lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ulam-Folge-3.png]]&lt;br /&gt;
&lt;br /&gt;
=== Problem: Finden der längsten Ulam-Folge ===&lt;br /&gt;
Man kann im Unterricht ein Problembewusstein entwickeln, dass die Termination dieser Entwicklung keinesfalls selbstverständlich ist, indem man z.B. den Term &amp;lt;code&amp;gt;3n + 1&amp;lt;/code&amp;gt; durch &amp;lt;code&amp;gt;3n - 1&amp;lt;/code&amp;gt; ersetzen lässt; die Schüler werden dann sehr schnell nachstehende Folgenentwicklung (und damit eine Endlosschleife) erkennen:&lt;br /&gt;
&lt;br /&gt;
 5, 14, 7, 20, 10, 5, 14, … &lt;br /&gt;
[[File:Smiley.svg|right|50px]]&lt;br /&gt;
Im Wettbewerb der Gruppenarbeit ist es immer eine spannende Angelegenheit, die Startzahl zu finden, welche die längste (?) Ulam-Folge bewirkt.&lt;br /&gt;
&lt;br /&gt;
Bis die Ulamfolge eine Zweierpotenz trifft, entwickeln sich oft sehr große Zahlen; im obigen Beispiel ist 9232 das größte Folgenglied. &lt;br /&gt;
&lt;br /&gt;
In unserem Java-Programm ist das eine schöne Gelegenheit, auch eine einseitige Verzweigung zu berücksichtigen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Ulam  {&lt;br /&gt;
  public static void main (String[] args)  {&lt;br /&gt;
    int n = Integer.parseInt(args[0]);&lt;br /&gt;
    //Zunächst wird das Maximum auf den Startwert gesetzt.&lt;br /&gt;
    int max = n;     &lt;br /&gt;
    int i = 0;&lt;br /&gt;
    while(n != 1) {&lt;br /&gt;
     i = i +1;&lt;br /&gt;
     if(n % 2 == 0)    &lt;br /&gt;
        n = n / 2;&lt;br /&gt;
     else    &lt;br /&gt;
       n = 3*n + 1;&lt;br /&gt;
     if (n &amp;gt; max)&lt;br /&gt;
       max = n;&lt;br /&gt;
    }&lt;br /&gt;
    System.out.printf(&amp;quot;%nDiese Ulamfolge umfasst %d Zahlen; %n&amp;quot;,i);&lt;br /&gt;
         System.out.printf(&amp;quot;das groesste Folgenglied ist %d.%n&amp;quot;,max);   &lt;br /&gt;
  }&lt;br /&gt;
} &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Ulam-Folge-4.png]]&lt;br /&gt;
&lt;br /&gt;
{{Fortsetzung|&lt;br /&gt;
vorher=Erste Schritte|vorherlink=Java/Erste Schritte|&lt;br /&gt;
weiter=Die Monte-Carlo-Methode&amp;lt;br&amp;gt; zur Bestimmung der Kreiszahl|weiterlink=Java/Monte-Carlo-Methode|&lt;br /&gt;
übersicht=Einstieg in Java&amp;lt;br&amp;gt;(Übersicht)|übersichtlink=Java#Übersicht|}}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* {{wpde|Ulam-Folge}}&lt;br /&gt;
* {{wpde|Ulam-Spirale}}&lt;br /&gt;
* [[Java/Erste Schritte]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;/div&gt;</summary>
		<author><name>Matthias Scharwies</name></author>
	</entry>
</feed>