Permutacije- python

Permutacije- python

Avtor: Mateja Gorišek

Opis problema


Permutacija je urejanje 'objektov'. Na primer je ena od možnih permutacij števil 1,2,3 in 4.
Če so vse permutacije urejene številčno ali abecedno pravimo, da so leksikografsko urejene.
Leksikografske permutacije števil 0,1 in 2 so:
012
021
102
120
201
210

Kaj je milijonta leksikografska permutacija števil 0,1,2,3,4,5,6,7,8 in 9?

Ideja rešitve


Želimo izpisati milijonto permutacijo števil 0,1,2,3,4,5,6,7,8 in 9.
Najprej bomo napisali splošno kodo, ki bo v seznam nizov izpisala vse permutacije danega števila. Pri tem si bomo pomagali z rekurzijo. Nato pa napišemo metodo, ki izpiše milijonto permutacijo danega števila.

Kode

Razlaga algoritma

a) Metoda permutacijeSez(n)

  • n je število, ki je zapisano v nizu, saj če je prva števka 0, nam python vrne napako,
  • assert n==str(n), 'Število je zapisano v nizu' : s stavkom assert preverimo ali je izpolnjen pogoj n==str(n), če ta pogoj ni izpolnjen se izpiše sporočilo,
  • if len(n)==1: return n : len(n) je dolžina niza n, če je dolžina enaka 1, potem vrnemo dano število. To je ustavitveni pogoj v rekurzivni metodi.
  • sez=[] : prazen seznam, v katerega bomo zaporedne permutacije danega števila (niza) dodajali na konec tega seznama,
  • for i in range(len(n)): z zanko for gremo po indeksih niza n , pomagamo si s funkcijo range(len(n)), ki gre od indeksa 0 do dolžine niza minus ena,
  • prvi=n[i] : v 'prvi' shranimo element niza n, ki je na i-tem indeksu,
  • ostanek=n[0:i]+n[i+1:] : ostanek so shranjena števila v nizu brez elementa(števila), ki je na i-tem indeksu,
  • a=permutacijeSez(ostanek) : rekurzivni klic, funkcija kliče samo sebe, za parameter podamo ostanek
  • per=[prvi+s for s in a] : seznamski izraz, ki elementu, ki je shranjen v 'prvi', dodamo vse možne permutacije ostanka
  • sez+=per : v seznam 'sez' na konec seznama doda elemente seznama per
  • na koncu pa vrnemo seznam vseh permutacij

Razlaga algoritma


b) Metoda izpisVseh(n)

  • sez=permutacijeSez(n) : klicanje metode permutacijeSez(n), kjer dobimo seznam nizov vseh permutacij tega števila
  • metoda nato, ko sprejme seznam nizov, ta seznam spremeni s pomočjo zanke for, ki gre po vseh elementih seznama, in jih zaporedoma izpisuje eno za drugo, da so na koncu vse permutacije izpisane v stolpcu ena pod drugo.

    c) Metoda milijonta(n):
  • Metoda sprejme seznam vseh permutacij danega števila n, ki je zapisan v nizu, to smo naredili tako, da smo metodo poklicali (sez=permutacijeSez(n)),
  • Nato pa pogledamo, če je dolžina seznama večja ali enaka milijon, potem izpišemo milijonto permutacijo število, ki ima indeks enak 999999,
  • V nasprotnem primeru pa prestrežemo napako in izpišemo sporočilo, s katerim je opisana napaka.

Testiranje

Razlaga testnih primerov


Za testne primere si izberem števila, ki so navedena v besedilu naloge in primere, ki pokažejo kje so napake in to napako 'ulovijo'.

  • permutacijeSez(012): s tem primerom pokažemo, da pride do sintaktične napake, saj se število ne more začeti z 0 in tako vrne SyntaxError napako.
  • permutacijeSez(23): število ni zapisano v nizu, zato se sproži izjema (AssertionError: Število je zapisano v nizu), ki smo jo ujeli s stavkom assert, tako smo preverili, ali nam metoda res preveri ali je število zapisano v nizu
  • permutacijeSez('012'): s tem primerom smo preizkusili ali metoda deluje pravilno
  • izpisVseh('012'): za boljši pregled vseh permutacij, jih izpišemo v stolpec, kjer so lepše razvidne vse permutacije, izbrala sem si primer, ker je že prikazan v navodilu naloge, lahko bi si izbrala pa tudi druga števila
0%
0%