1
Ohjelmointi, palvelimet ja muu edistyneempi käyttö / Vs: x-kokoisten sarjojen kombinaatioiden tulostus alkiojoukosta (Pseudo)?
« : 15.06.23 - klo:16.54 »
Minulla on sinulle arvoitus.
Miten alla oleva pseudokoodi tuottaa oikean vastauksen?
Mietin sitä täällä itse. Tuo tehtävä oli kiehtova, mutta se ylitti omat kykyni, joten kysyin lopulta neuvoa tekoälyltä ja sain vastaukseksi toimivan Python koodin. Muutin sen ensin kommentoiduksi ja sitten pseudokoodiksi ja olen nyt tuijottanut sitä miettien syntyjä syviä.
Sama Python koodina.
PSST.
Tuossa sinun kirjoittamassasi pseudokoodissa on jotain hämärää. Vääntelin sitä miten päin tahansa, niin aina kun sen yrittää muuttaa oikeaksi koodiksi, se joko jumittuu ikuiseen silmukkaan tai sitten ei tulosta mitään, tai sitten tulostaa vain kaikki taulukon alkiot. Silti tuossa toimivassa pseudokoodissa on jotain samantapaista ideaa.
Ehkä sitä tehtävää voisi helpottaa niin, että aluksi kokeilee luoda listan kaikista mahdollisista listan alkioiden yhdistelmistä ja sen jälkeen alkaa karsia niitä vaihtoehtoja. Siinä ei kyllä voi käyttää tavallista silmukkaa, koska se vaatisi sisäkkäisiä silmukoita niin monta kuin loppuvastauksessa on lukuja.
Miten sinä yleistäisit tuon niin, että sisäkkäisten silmukoiden määrän voisi valita?
Miten alla oleva pseudokoodi tuottaa oikean vastauksen?
Mietin sitä täällä itse. Tuo tehtävä oli kiehtova, mutta se ylitti omat kykyni, joten kysyin lopulta neuvoa tekoälyltä ja sain vastaukseksi toimivan Python koodin. Muutin sen ensin kommentoiduksi ja sitten pseudokoodiksi ja olen nyt tuijottanut sitä miettien syntyjä syviä.
Koodia: [Valitse]
ALIOHJELMA KOMBINAATIOT(A [], LKM):
JOS LKM > A.PITUUS:
PALAUTA TYHJÄLISTA
JOS LKM == 0:
PALAUTA LISTA JONKA SISÄLLÄ ON TYHJÄ LISTA
KOMBINAATIOT = TYHJÄLISTA
KÄY LÄPI i:n ARVOT NOLLASTA A:n PITUUTEEN -1 ASTI
A1 = A.OTA_LISTALTA_i_ENSIMMÄISTÄ_ALKIOTA_UUDEKSI_LISTAKSI()
LKM1 = LKM - 1
OSAKOMBINAATIOT = KOMBINAATIOT(A1, LKM1)
KÄY LÄPI OSAKOMBINAATIOT JOS SE EI OLE TYHJÄ LISTA
OSAKOMBINAATIO.LISÄÄ_LISTALLE(A[i])
KOMBINAATIOT.LISÄÄ_LISTALLE(OSAKOMBINAATIO)
PALAUTA KOMBINAATIOT
Sama Python koodina.
Koodia: [Valitse]
"""
Kombinaatioita listasta luova aliohjelma.
koko: Kuinka monta alkiota kombinaatiossa on.
lista: Mistä listasta luodaan kombinaatiot.
Aliohjelma on rekursiivinen, eli se kutsuu itse itseään.
"""
def kombinaatiot(lista, koko):
if koko > len(lista): # 1.
return []
if koko == 0: # 2.
return [[]]
kombinaatiolista = []
for i in range(0, len(lista)):
# Jokaisella rekursiokerralla listalta jää aina pois
# sen viimeinen alkio, jota ei käsitellä lainkaan.
# Lisäksi kombinaatioiden alkioiden määrä vähenee yhdellä.
for kombinaatio in kombinaatiot(lista[:i], koko-1):
# Rekursiivinen funktiokutsu toimii näin. Muuttujien arvot
# ovat tässä tämän suorituskerran arvoja, eivät kutsulle
# annettuja arvoja.
# 1. Jos i < koko, tätä ei suoriteta
# 2. Koolla 1 kombinaatiolistalla on alkiona pelkkä lista[i]
# 3. Koolla >1 yhtä pienemmän koon listaan lisätään alkioksi lista[i]
kombinaatiolista.append(kombinaatio + [lista[i]])
return kombinaatiolista # 3.
lista = ['a','b','c','d','e','f']
kombinaationkoko = 5
print("Ohjelma laskee", kombinaationkoko, "alkioiset kombinaatiot listalle", lista)
print("VASTAUS")
for kombinaatio in sorted(kombinaatiot(lista, kombinaationkoko)):
print(kombinaatio)
PSST.
Tuossa sinun kirjoittamassasi pseudokoodissa on jotain hämärää. Vääntelin sitä miten päin tahansa, niin aina kun sen yrittää muuttaa oikeaksi koodiksi, se joko jumittuu ikuiseen silmukkaan tai sitten ei tulosta mitään, tai sitten tulostaa vain kaikki taulukon alkiot. Silti tuossa toimivassa pseudokoodissa on jotain samantapaista ideaa.
Ehkä sitä tehtävää voisi helpottaa niin, että aluksi kokeilee luoda listan kaikista mahdollisista listan alkioiden yhdistelmistä ja sen jälkeen alkaa karsia niitä vaihtoehtoja. Siinä ei kyllä voi käyttää tavallista silmukkaa, koska se vaatisi sisäkkäisiä silmukoita niin monta kuin loppuvastauksessa on lukuja.
Koodia: [Valitse]
def kaikkimahdollisetkolmenyhdistelmät(LISTA):
for merkki in LISTA:
for merkki2 in LISTA:
for merkki3 in LISTA:
print([merkki, merkki2, merkki3])
kaikkimahdollisetkolmenyhdistelmät("ABCDEFG")
Miten sinä yleistäisit tuon niin, että sisäkkäisten silmukoiden määrän voisi valita?