Tehetséggondozás az informatikában
Az első függvények: U és D
Kézenfekvőnek tűnik tehát a következő gondolatmenet: kezdetben adott az
egyelemű lista a kindulási MI szóval, erre alkalmazzuk az összes
alkalmazható szabályt, a kapott szavakat a lista végére fűzzük, majd vesszük
a lista következő szavát, és így folytatjuk a végtelenségig.
Egyelőre csak az első két szabály (python nyelven megírt) megvalósításával
foglalkozva, valamint –időnk végességére való tekintettel– beérve kilenc új
szóval:
def rule1(list, i):
word= list[i]
if word[-1]=='I':
list+= [ word+'U' ]
def rule2(list, i):
word= list[i]
list+= [ word+word[1:] ]
def rules(list, i):
rule1(list, i)
rule2(list, i)
i+= 1
i= 0
list= [ 'MI' ]
while i<10:
rules(list, i)
Meglepő vagy nem meglepő, de a program nem áll le. Ennek kézenfekvő oka
lehet, hogy az i változó értéke nem növekszik, emiatt végtelen ciklusba
kerülünk. Más programozási nyelvekre gondolva hamar felvetődik a kérdés:
vajon érték szerint vagy cím szerint kapják meg a függvények a
paramétereiket?
Módosítsuk a programot, írassuk ki a változók értékét:
i= 0
list= [ 'MI' ]
while i<10:
print(i, list)
rules(list, i)
A program valóban végtelen ciklusba került; megszakítása után alighanem
jobban látszik, hogy az i változó értéke tényleg nem változik, mindvégig 0
marad.
A végtelen ciklust elkerülhetjük, ha nem i értékét, hanem a lista hosszát
korlátozzuk:
i= 0
list= [ 'MI' ]
while len(list)<11:
print(i, list)
rules(list, i)
Ez persze csak átmenetileg hoz enyhülést: a program kétségkívül leáll, de
mivel i értéke nem változik, mindig a lista élén álló MI szóból kapjuk a
lehetséges új szavakat (összesen kétfélét):
0 ['MI']
0 ['MI', 'MIU', 'MII']
0 ['MI', 'MIU', 'MII', 'MIU', 'MII']
0 ['MI', 'MIU', 'MII', 'MIU', 'MII', 'MIU', 'MII']
0 ['MI', 'MIU', 'MII', 'MIU', 'MII', 'MIU', 'MII', 'MIU', 'MII']
És ami rendkívül zavaró: miközben i értéke nem változik, a lista látványosan
hízik. A két paramétert ugyanolyan módon adtuk át a függvényeknek, de mégis
másképp viselkednek: a függvények mindkettőnek megváltoztatják az értékét,
de a függvényen kívül ez csak a lista esetében érvényesül…