Python-The Collatz Sequence

first, note how you ‘ re duplicating calculations:

print(num//2)num = num //2

tämä ei ehkä aiheuta ongelmia tämän nimenomaisen koodin kanssa, mutta se ei ole hyvä käytäntö. Teet kaksi kertaa niin paljon työtä kuin sinun täytyy, mikä voi aiheuttaa suorituskykyongelmia, kun alat kirjoittaa monimutkaisempaa koodia. Tee laskenta kerran, ja tallenna tulos. Tässä tapauksessa sinun tarvitsee vain kääntää nämä rivit ja käyttää num:

num = num // 2print(num)

varmista myös, että sinulla on asianmukainen väli operaattoreiden ympärillä, ja ole johdonmukainen.

sinun if ja elif tapauksesi eivät kuulu toisiinsa, eikä else: si saisi koskaan tapahtua. Jos ensimmäinen ehto on tosi, muiden on oltava epätosia ja päinvastoin. Toista laskua ei tarvita. Kun olet kirjoittanut uudelleen, huomaat, että joka tapauksessa Tulostaminen ei ole tarpeen. Voit vain tulostaa jälkeen:

while num > 1: if num % 2 == 0: num = num // 2 else: num = 3 * num + 1 print(num)

koska olet vain reassing num jompikumpi kahdesta ehdon mukaisesta vaihtoehdosta, ehdollista ilmaisua voi käyttää tässäkin puhtaasti:

while num > 1: num = (num // 2) if num % 2 == 0 else (3 * num + 1) print(num)

henkselit eivät ole tarpeellisia, mutta luulen, että ne ovat hyödyllisiä tässä toimijoiden määrän vuoksi.

numeroiden Tulostaminen ei ole ihanteellista tässä. Useimmissa koodeissa pitää pystyä käyttämään tuottamaansa dataa. Jos haluat analysoida tuotettu sekvenssi, sinun pitäisi tehdä jotain siepata stdout, joka on kallista ja liian monimutkainen. Tee siitä toiminto, joka kerää ja palauttaa listan. Seuraavissa esimerkeissä, olen myös lisännyt joitakin tyyppi vihjeitä, jotta se selkeyttää, mitä tyyppi tiedot on:

from typing import Listdef collatz(starting_num: int) -> List: nums = num = starting_num while num > 1: num = (num // 2) if num % 2 == 0 else (3 * num + 1) nums.append(num) return nums

tai, paljon puhtaampi lähestymistapa on tehdä siitä generaattori, joka tuottaa numerot:

# Calling this function returns a generator that produces ints# Ignore the two Nones, as they aren't needed for this kind of generatordef collatz_gen(starting_num: int) -> Generator: yield starting_num num = starting_num while num > 1: num = (num // 2) if num % 2 == 0 else (3 * num + 1) yield num>>> list(collatz_gen(5))

on muutamia merkittäviä asioitagetNum:

Python käyttää nimitystä” snake_case”, ei”camelCase”.

global num käyttönne tässä on tarpeetonta ja hämmentävää. Aivan kuten ennenkin, eksplisiittisesti return mikä tahansa tieto, jonka funktio tuottaa:

def get_num() -> int: raw_num = input("> ") try: return int(raw_num) except ValueError: print('Please enter a number') return get_num()

huomaa, että sen sijaan, että siirtäisimme globaalin num, me vain palautamme numeron. Minä myös pyörittelin asioita hieman ja käytin osuvampia nimiä. Käsitteellisesti sanoisin, että num = input("> ") on väärin. Juoksuhetkellä num ei sisällä lukua (se sisältää merkkijonon).

tämä ei ole hyvä rekursion käyttö. Se ei todennäköisesti aiheuta sinulle mitään ongelmia, mutta jos käyttäjä on todella tyhmä ja syöttää vääriä tietoja ~1000 kertaa, ohjelma kaatuu. Käytä vain silmukkaa:

def get_num() -> int: while True: raw_num = input("> ") try: return int(raw_num) except ValueError: print('Please enter a number')

Pythonin kaltaisissa kielissä kannattaa olla varovainen rekursion käytössä tapauksissa, joissa ei ole takeita siitä, kuinka monta kertaa funktio rekursioituu.

nimeäisin tämän luultavasti myös joksikin lähempänä ask_for_num. “get” ei tee kovin selväksi, mistä data on peräisin.

otettuna kokonaan, päädyt:

from typing import Generatordef collatz_gen(starting_num: int) -> Generator: yield starting_num num = starting_num while num > 1: num = (num // 2) if num % 2 == 0 else (3 * num + 1) yield numdef ask_for_num() -> int: while True: raw_num = input("> ") try: return int(raw_num) except ValueError: print('Please enter a number')

joita voidaan käyttää kuten:

num = ask_for_num()for n in collatz_gen(num): print(n)

Vastaa

Sähköpostiosoitettasi ei julkaista.