Info 2 hatodik (és utolsó) házi feladat: "rekurzió", fél Catalan mátrix kiíratása

Utolsó módosítás: 2009. április 23.

Olyan programot kell írnia, amely kiír egy bizonyos háromszögmátrixot, amelynek az elemeit egy rekurzió adja meg.

Az S mátrix, amit ki kell írnia, N sorból és N oszlopból áll. Az első sor első eleme 1, a többi eleme 0. A további sorokban az első elemet úgy kapja, hogy az előző sor első és második elemét összeadja. Az összes többi elemet úgy kapja, hogy veszi a közvetlenül fölötte álló elem kétszeresét, és hozzáadja a fönt jobbra és fönt balra álló két számot.

Például N = 7 esetén a mátrix a következő:

  1   0   0   0   0   0   0 
  1   1   0   0   0   0   0 
  2   3   1   0   0   0   0 
  5   9   5   1   0   0   0 
 14  28  20   7   1   0   0 
 42  90  75  35   9   1   0 
132 297 275 154  54  11   1 

A program a standard bemenetről olvassa be az N egész számot (legalább 3 és legfeljebb 20). A kimenetre ki kell írnia a mátrix elemeit, de nem muszáj ezeket szépen oszlopokban egymás alá rendeznie, hanem elválaszthatja csak egy szóközzel is, tehát kiírhatja ezt is.

1 0 0 0 0 0 0 
1 1 0 0 0 0 0 
2 3 1 0 0 0 0 
5 9 5 1 0 0 0 
14 28 20 7 1 0 0 
42 90 75 35 9 1 0 
132 297 275 154 54 11 1 

A programot ruby nyelven írja meg. A bemenetet a standard bemenetről olvassa be, így például ha a forráskódot a hfa.rb nevű fájlba mentette el, és a ruby -w hfa.rb parancs után beüti a 7 számot, majd az entert, akkor a fenti táblázatot írja ki.

Néhány tanács. Mivel minden sort az előző sorból lehet előállítani, és felülről lefele írja ki a sorokat, a programnak nem kell eltárolnia az összes sort, hanem elég csak az előző sor és az új sor elemeit eltárolni.

A bemenetről egy sort a gets() függvény olvas be, és ebből az Integer() függvénnyel kaphat egész számot, vagyis ha úgy kezdi a programját, hogy meret = Integer(gets()), akkor a fenti bemenet esetén a meret változó értéke a 7 szám lesz.

Ha esetleg szépen egymás alá akarja kiírni a számokat, akkor egy számot a .to_s() metódussal írjon ki egy új sztringbe, majd ezt a sztringet az .rjust(p) metódussal legalább p szélesre kiegészítheti, így például ha a v értéke a 8 szám, akkor a v.to_s.rjust(5) értéke a "    8" sztring lesz, aminek a tartalmát a print függvénnyel kiírathatja. Arra feltétlenük vigyázzon, hogy két szám közé mindig kerüljön legalább egy szóköz, ne folyjanak össze a számok.

Még valami. Érdemes lehet ezt a mátrixot összeszorozni a transzponáltjával, és megnézni, milyen eredmény jön ki.

A megoldást e-mailben küldje el az ambrus@@mmaatthh..bbmmee..hhuu (a dupla karaktereket csak egyszer kell beírni) címre. Az emailben csatolmányként küldje el a megoldáshoz használt forráskódot, és írhat bármilyen megjegyzéseket, amit a megoldással kapcsolatban lényegesnek talál. Az emailben feltétlenül adja meg a nevét, nem szeretnék névtelen házi feladatokat azonosítani. Írja továbbá az emailbe az "info2" szöveget, valamint a feladat rövid nevét, jelen esetben azt, hogy "rekurzió", hogy könnyebben szét tudjam válogatni a feladatokat.

Ha a feladathoz bármilyen kérdése van, vagy elakad a megoldással, akkor keressen meg emailben vagy személyesen, akár a gyakorlaton, akár azon kívül.

A feladatot 2009. április 23-án illetve 24-én tűzom ki. A megoldás határideje ehhez képest két hét, május 8., péntek (aznap még be lehet küldeni).