Collatz Funktion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RRButon
User
Beiträge: 8
Registriert: Mittwoch 6. Oktober 2021, 15:17

Hallo zusammen

Ich möchte eine Collatz Funktion schreiben. Die Funktion macht auch das was ich will. Weiter möchte ich, dass am Schluss die durchlaufenen Schleifen gezählt werden. Ich habe schon einiges Probiert, hat jedoch nie geklappt. Weiss jemand eine Lösung?

Code: Alles auswählen

def collatz(n):
    print(n)
    while n != 1:
        if n % 2 == 0:
            n = n // 2
            print(n)
        else:
            n = 3 * n + 1
            print(n)
    print(n)
Ich möchte, dass bei der Eingabe z.B. collatz(13) die zahl 10 ausgegeben wird.

Vielen Dank im voraus für die Hilfe
Benutzeravatar
Dennis89
User
Beiträge: 1560
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

du musst jeden Schleifendurchgang mit zählen:

Code: Alles auswählen

#!/usr/bin/env python3


def collatz(wert):
    counter = 0
    print(f"Der Startwert beträgt: {wert}")
    while wert > 1:
        if wert % 2 == 0:
            wert //= 2
            print(wert)
        else:
            wert = 3 * wert + 1
            print(wert)
        counter += 1
    print(f"Das waren {counter} Durchgänge")


def main():
    collatz(13)


if __name__ == "__main__":
    main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Buchfink
User
Beiträge: 193
Registriert: Samstag 11. September 2021, 10:16

es sind zwar 10 ausgegebene Ziffern (wg. des Startwertes), allerdings nur 9 Durchläufe.

Code: Alles auswählen

def collatz(n):
    print(f"Startwert für Collaz({n})")
    count = 0
    print("Hier fängt die Schleife an")
    while n != 1:
        count += 1
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3 * n + 1
        print(f"{count}. Durchlauf liefert {n} ")

collatz(13)
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man sowohl im if-Block als auch im else-Block die selben Anweisungen hat, kann man sie auch einmal zum Schluß hinschreiben.

Code: Alles auswählen

from itertools import count

def collatz(wert):
    print(f"Der Startwert beträgt: {wert}")
    for counter in count():
        if wert == 1:
            break
        elif wert % 2 == 0:
            wert //= 2
        else:
            wert = 3 * wert + 1
        print(wert)
    print(f"Das waren {counter} Durchgänge")
Benutzeravatar
__blackjack__
User
Beiträge: 14069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mir gefällt die Vermischung aus Folge generieren und Ausgaben nicht so wirklich.

Code: Alles auswählen

#!/usr/bin/env python3


def collatz(number):
    if number < 1:
        raise ValueError(f"start number must be ≥1, not {number!r}")

    while True:
        yield number
        if number == 1:
            break

        number = number // 2 if number % 2 == 0 else 3 * number + 1


def main():
    for start in range(1, 16):
        numbers = list(collatz(start))
        print(f"{start} → #{len(numbers)}: {numbers}")


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

1 → #1: [1]
2 → #2: [2, 1]
3 → #8: [3, 10, 5, 16, 8, 4, 2, 1]
4 → #3: [4, 2, 1]
5 → #6: [5, 16, 8, 4, 2, 1]
6 → #9: [6, 3, 10, 5, 16, 8, 4, 2, 1]
7 → #17: [7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
8 → #4: [8, 4, 2, 1]
9 → #20: [9, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
10 → #7: [10, 5, 16, 8, 4, 2, 1]
11 → #15: [11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
12 → #10: [12, 6, 3, 10, 5, 16, 8, 4, 2, 1]
13 → #10: [13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
14 → #18: [14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
15 → #18: [15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten