Hirdetés

Új hozzászólás Aktív témák

  • #74220800
    törölt tag

    Hali,

    mondjuk én első körben nem egyből egy random mátrixszal indítanék, hanem egy kicsit ellenőrzöttebb körülmények között tesztelném a cuccot. Pl. egy ilyennel:

    1 1 1 1 1
    1 2 2 2 1
    1 2 3 2 1
    1 2 2 2 1
    1 1 1 1 1

    És akkor debug módban szépen lépkedve kiderítheted, hogy az a baj, hogy először mindig felfelé próbálkozol kijutni, majd ha nem megy, akkor lefelé. Csakhogy a próbálkozásod előtt nem csekkolod, hogy egyáltalán érdemes-e (<x). Mindenképp megpróbálod, így visszajutunk egy korábbi állapotba, ahonnan nem sikerült felfelé kijutni, így azt megpróbálni sem lenne érdemes, de ő csakazértis újra felfelé próbál. Nem tud, ezért megint lefelé indul el. A lefele ágban először újra felfelé indulna, és... gondolom érted, hogy ez a végtelenségig tart, ide-oda pingpongozik a két sor egymással.

    Egy ilyen térképpel például szépen működik a progi, mert mindig csak felfelé kell másznia:

    1 1 1 1 1
    1 2 2 2 1
    1 3 3 3 1
    1 4 4 4 1
    1 5 5 5 1

    Rekurzív hívásnál nagyon fontos a sorrend, amint tudod, terminálni kell a folyamatot. Érdemes először ellenőrizni, hogy a szomszédos szám valóban jó irány-e, és csak akkor ráhívni rekurzívan, ha tényleg van esély a kijutásra.

    ----
    Apró adalék, hogy egy kis emlékezet bevezetésével, drasztikusan gyorsítható a program. Ugyanis ha számon tartod (pl. egy kimeneti mátrixban), hogy adott cellából sikerült-e korábban kijutni, akkor nem kell újra és újra végigjátszani a teljes útvonal bejárást.

    Thx mint mindig.

    Megcseréltem az If-eknél a sorrendet és most működik....

    if (row == arr.length -1 || row == 0 || column == arr[row].length -1 || column == 0)
    return true;
    else if (arr[row-1][column] < x && flows(row-1,column, arr))
    return true;
    else if (arr[row+1][column] < x && flows(row+1,column, arr))
    return true;
    else if (arr[row][column-1] < x && flows(row,column-1, arr))
    return true;
    else
    return (arr[row][column+1] < x && flows(row,column+1, arr));

    Deeee, ezt megint nem teljesen értem. Ok gondolom ha az első értek hamis, akkor eleve be sem kéri a 2. elemet. De miért nem megy úgy, ha előszór a rekurzív képletet hívom meg, ha hamis, akkor lep tovább a következö if-re?

Új hozzászólás Aktív témák