2 Fragen zur Ulamfolge
-
Hallo
leider komme ich bei folgender Aufgabe nicht weiter und hoffe ihr könnt mir da helfen:
Aufgabe 4.
a)
Definieren Sie eine Funktion USZ, die für eine eingegebene natürliche Zahl u > 0 die Anzahl der Glieder der Ulamfolge zählt (bis (einschließlich!) zum ersten Auftreten der Eins) und diese Anzahl zurückgibt.
Beispiel: USZ(3) = 8, weil hier die Ulamfolge (3, 10, 5, 16, 8, 4, 2, 1) aus 8 Gliedern besteht.
b)
Verwenden Sie diese Funktion USZ in einem C++-Programm, das nach Eingabe einer natürlichen Zahl BereichsEnde für alle Zahlen AnfZ von 1 bis BereichsEnde die Ulamschrittzahl ermittelt und die größte dieser Schrittzahlen (MaxSZ) sowie die zugehörige Anfangszahl AnfZ ausgibt, bei der die maximale Schrittzahl erstmalig erreicht wurde.
(Tip: Dieselbe Schrittzahl – und folglich auch die maximale – kann mehrfach auftreten; es gilt offenbar auch USZ(20) = 8.)Soweit bin ich bereits gekommen - ich weiß aber nicht, wie ich jetzt Teil b umsetzen soll:
# include <iostream.h> int USZ(int f_u) { int schritt; schritt = 1; while (f_u != 1) { if (f_u % 2 == 0) { f_u = f_u/2; } else { f_u = 3 * f_u + 1; } schritt++; } return schritt; } void main() { int u; cout << "Eine natuerliche Zahl > 0 eingeben: "; cin >> u; cout << "Anzahl der Glieder der Ulamfolge: " << USZ(u) << endl; }
Und dann hätte ich da noch eine zweite Frage: wie sieht die rekursive Funktion der Ulamfolge aus?
Vielen Dank schon mal für eure Antworten
Gruß
Keine_Ahnung
-
int main() { int BereichsEnde; cin >> BereichsEnde; int MaxSZ = -1; int AnfZ= 0; for(int i = 1; i <= BereichsEnde; i++) { int SZ = USZ(i); cout << SZ << endl; if(SZ > MaxSZ) { MaxSZ = SZ; Anfz = i; } } cout << Anfz << endl; cout << MaxSZ << endl; }
Und dann hätte ich da noch eine zweite Frage: wie sieht die rekursive Funktion der Ulamfolge aus?
int USZ(int f_u) { if(f_u == 1) return 1; if(f_u % 2 == 0) return USZ(f_u / 2)+1; else return USZ(3 * f_u + 1)+1; }
-
size_t usz(size_t n){return 1+(n>1?usz(n&1?3*n+1:n/2):0);}
-
Windalf schrieb:
size_t usz(size_t n){return 1+(n>1?usz(n&1?3*n+1:n/2):0);}
Ist das die besonders gut lesbare Fassung
:p