Seite 1 von 1

Collatz Funktion

Verfasst: Mittwoch 6. Oktober 2021, 15:39
von RRButon
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

Re: Collatz Funktion

Verfasst: Mittwoch 6. Oktober 2021, 17:27
von Dennis89
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

Re: Collatz Funktion

Verfasst: Mittwoch 6. Oktober 2021, 18:04
von Buchfink
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)

Re: Collatz Funktion

Verfasst: Mittwoch 6. Oktober 2021, 18:05
von Sirius3
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")

Re: Collatz Funktion

Verfasst: Mittwoch 6. Oktober 2021, 21:54
von __blackjack__
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]