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…