Bölüm 2: Minimaks ve Alfa-Beta Budaması
Çoktan Seçmeli · Dallanma etkeni
Soru 1
Bir oyunda her konumda 10 yasal hamle var. Minimaksın arama derinliği 4 yarım hamleden 6 yarım hamleye çıkarılırsa okunan yaprak sayısı yaklaşık kaç katına çıkar?
Doğru cevap C. Her iç düğümün b çocuğu olan ağaçta d derinlikte bd yaprak vardır: 104 = 10.000 yaprak 106 = 1.000.000 olur, yani 100 kat. Her yarım hamle işi b = 10 katına çıkarır; iki yarım hamle 10 · 10 = 100 eder. B katları toplar, çarpmaz. A ve D büyümenin derinlikle doğrusal olduğunu varsayar; oysa büyüme üsteldir.
Çoktan Seçmeli · Minimaksın garantisi
Soru 2
Bir konumun minimaks değeri +2. MAX her hamlesinde minimaks hamlesini oynuyor; MIN ise zaman zaman hata yapan bir rakip. MAX'ın oyun sonunda alacağı fayda için hangisi kesinlikle doğrudur?
Doğru cevap A. Minimaks değeri, MIN'in her hamlesine en iyi cevabı verdiği varsayımıyla MAX'ın garanti ettiği değerdir. MIN en iyi cevaptan saparsa MAX en az bu değeri alır, daha azını hiçbir zaman almaz: minimaks değeri güvenli bir alt sınırdır. Sonucun tam 2 olması (B) yalnız iki taraf da hatasız oynarsa kesindir. Minimaks, zayıf rakibe karşı kazancı en büyük yapan hamleyi aramaz; ama garantisi de düşmez (C ve D yanlış).
Hesaplama Sorusu · Elle minimaks
Soru 3: Üç Katmanlı Ağaçta Minimaks
Kök A (MAX), ikinci katman MIN, üçüncü katman MAX. Yapraklar soldan sağa E = [2, 8], F = [5, 3], G = [9, 1], H = [4, 6], I = [7, 2], J = [3, 10].
a) Kökün minimaks değeri nedir, MAX hangi hamleyi seçer?
b) İki taraf da en iyi oynarsa oyun hangi yaprakta biter?
c) En büyük yaprak (10) neden ulaşılamaz bir sonuçtur?
Cevabı göster
a) Üçüncü katman (MAX): E = 8, F = 5, G = 9, H = 6, I = 7, J = 10.
İkinci katman (MIN): B = min(8, 5) = 5, C = min(9, 6) = 6, D = min(7, 10) = 7.
Kök: A = max(5, 6, 7) = 7; MAX D'yi seçer.
b) Yol A → D → I → 7: D'de MIN, I'yı (7) J'ye (10) tercih eder; I'da MAX 7'yi seçer.
c) 10, J'nin altındadır. J'ye gidilip gidilmeyeceğine D'de MIN karar verir ve 7 veren I'yı seçer: MAX'ın 10'a ulaşması için MIN'in hata yapması gerekir. G'deki 9 da aynı nedenle ulaşılamaz.
Çoktan Seçmeli · P ve N konumları
Soru 4
Son jetonu alanın kazandığı Nim'de hangisi bir P konumudur (sıradaki oyuncu, rakip hatasız oynarsa kaybeder)?
Doğru cevap D. Bouton kuralına göre konum P'dir ⇔ yığınların nim toplamı (XOR) 0'dır. 1 ⊕ 4 ⊕ 5 = 001 ⊕ 100 ⊕ 101 = 000 = 0: (1, 4, 5) P'dir. Ötekilerde toplam sıfırdan farklıdır: 2 ⊕ 4 ⊕ 5 = 3, 1 ⊕ 3 ⊕ 5 = 7, 2 ⊕ 3 ⊕ 4 = 5; bunlar N konumudur. Tam ağaçta negamaks da aynı sonucu verir: (1, 4, 5)'in değeri sıradaki oyuncu için −1, ötekilerinki +1.
Hesaplama Sorusu · Negamaks ve XOR kuralı
Soru 5: Nim'de Negamaks
Nim konumu (2, 4); son jetonu alan kazanır. Değer sıradaki oyuncunun gözünden yazılıyor: değer(s) = maxa −değer(sonuç(s, a)), hamlesi olmayan konum −1.
a) (k, k) biçimindeki konumların (eşit iki yığın) değeri nedir? Neden?
b) (2, 4)'ün altı çocuğunun değerleri ve (2, 4)'ün değeri nedir? Kazandıran hamle hangisidir?
c) XOR kuralı aynı hamleyi verir mi?
d) Kökü (2, 4) olan tam ağaçta kaç düğüm vardır?
Cevabı göster
a) (0, 0)'ın hamlesi yoktur: −1. (k, k)'den yapılan her hamle yığınları eşitsiz bırakır; rakip öteki yığından aynı sayıda jeton alıp yine (j, j) yapar. Bu ayna stratejisiyle (k, k) her k için −1, yani P'dir.
b) Çocuklar ve sıradakine değerleri: (1, 4): +1, (0, 4): +1, (2, 3): +1, (2, 2): −1, (2, 1): +1, (2, 0): +1.
(2, 2) = −1 olduğundan değer(2, 4) = −(−1) = +1 (N). Tek kazandıran hamle ikinci yığından 2 jeton alıp (2, 2) bırakmaktır; öteki beş çocuk +1'dir, yani rakibe kazandırır.
c) 2 ⊕ 4 = 010 ⊕ 100 = 110 = 6. 4 ⊕ 6 = 2 < 4: ikinci yığın 2'ye iner. 2 ⊕ 6 = 4 > 2: birinci yığından böyle bir hamle yok. İki yöntem aynı hamleyi bulur.
d) Kök dâhil 216 düğüm; bunun 33'i yalnız (2, 2) alt ağacıdır. XOR kuralı birkaç işlemle biter.
Çoktan Seçmeli · Derinlik cezası
Soru 6
XOX'ta derinlik cezası ±(10 − d) kullanılıyor; değerler X'in gözünden yazılıyor ve sıra O'da (MIN). O'nun dört hamlesi sırasıyla şu sonuçlara gidiyor: (1) kökten 1 yarım hamle sonra O kazanır, (2) 3 yarım hamle sonra O kazanır, (3) berabere, (4) 2 yarım hamle sonra X kazanır. Değerler ve O'nun seçimi nedir?
Doğru cevap B. O kazanırsa değer −(10 − d)'dir: d = 1 için −9, d = 3 için −7. X kazanırsa +(10 − d): d = 2 için +8; beraberlik 0. O, MIN olduğu için en küçük değeri, −9'u, yani hemen kazanan hamleyi seçer. A bakış açısını karıştırır: ağaçta tek sayı vardır ve hep X'in gözündendir. “Kaybı geciktirmek” kaybeden taraf içindir; burada kaybeden X'tir (C). D ±1 ölçeğidir; hızlı ve yavaş kazancı ayırt edemez.
Hesaplama Sorusu · XOX ve derinlik cezası
Soru 7: XOX Konumunu Değerlendirme
X sol üstte ve üst ortada, O sağ üstte ve sol ortada; sıra X'te (MAX). Değerler X'in gözünden, derinlik cezasıyla: X kazanırsa +(10 − d), O kazanırsa −(10 − d), berabere 0; d kökten hamle sayısı.
a) Beş boş karenin minimaks değeri nedir?
b) X hangi kareyi seçer? Gerekçesi nedir?
c) Alt satırdaki kareler neden kaybettirir?
Cevabı göster
a) Merkez +7, sağ orta 0, sol alt, alt orta ve sağ alt −6.
b) Merkez: çatal kurar. X'in iki tehdidi oluşur: orta sütun (alt orta boş) ve çapraz (sağ alt boş). O birini kapatır, X üçüncü hamlesinde ötekini tamamlar: 10 − 3 = +7.
c) X alt satıra oynarsa O çatal kurar: X sol alta oynarsa O sağ ortaya (tehditler: merkez ve sağ alt), alt orta ya da sağ alta oynarsa O merkeze (tehditler: sağ orta ve sol alt). X birini kapatır, O kökten dört hamle sonra kazanır: −(10 − 4) = −6. Sağ orta bu çatalları önler ama X'e tehdit kazandırmaz: 0.
Çoktan Seçmeli · α ve β
Soru 8
Bir MAX düğümüne [α, β] = [3, 9] aralığı gelmiştir. İlk çocuğu bir MIN düğümüdür ve aynı aralıkla çağrılır; çocukta β 5'e iner ve çocuk 5 döndürür. MAX düğümündeki aralık şimdi nedir?
Doğru cevap A. Aralık ebeveynden çocuğa aynen iner; ebeveyne yalnız değer döner. MAX düğümü dönen 5 ile deger = 5 ve α = max(3, 5) = 5 yapar; β = 9 değişmez: [5, 9]. Çocuktaki β = 5 çocuğun yerel değişkenidir, ebeveyne taşınmaz (B). β'yı yalnız MIN düğümleri küçültür (C). D, dönen değerin ebeveynde α'yı büyüttüğünü unutur.
Adım Adım İzleme · Alfa-beta budaması
Soru 9: Alfa-Beta Kodunu İzleme
Kök A (MAX), B, C, D (MIN). Program ne yazdırır? Hangi yapraklar hiç okunmaz, budama hangi düğümlerde olur?
from math import inf T = {"A": ["B", "C", "D"], "B": [5, 8], "C": [6, 2, 9], "D": [4, 8]} def alfabeta(n, a, b, maks): if isinstance(n, int): # yaprak return n deger = -inf if maks else inf for c in T[n]: v = alfabeta(c, a, b, not maks) if maks: deger = max(deger, v); a = max(a, deger) else: deger = min(deger, v); b = min(b, deger) if a >= b: break # budama return deger print(alfabeta("A", -inf, inf, True))
Kodun kurduğu ağaç: kök MAX, ikinci katman MIN. Henüz hiçbir yaprak okunmadı.
İlk çağrı: kök A bir MAX düğümü; deger = -inf, a = -inf, b = inf.
alfabeta("B") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [-inf, inf].
alfabeta(5) bir yaprak: 5 döner. min ile deger = 5, b = 5; a < b, devam.
alfabeta(8) bir yaprak: 8 döner. min ile deger = 5, b = 5; a < b, devam; B bitti, 5 döner.
B çağrısı 5 döndürdü. max ile deger = 5, a = 5; a < b, devam.
alfabeta("C") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [5, inf].
alfabeta(6) bir yaprak: 6 döner. min ile deger = 6, b = 6; a < b, devam.
alfabeta(2) bir yaprak: 2 döner. min ile deger = 2, b = 2; a ≥ b.
a = 5 ≥ b = 2: break. C en fazla 2 verir; A zaten 5 değerini garanti etti. Yaprak 9 hiç okunmaz; C, 2 döndürür.
C çağrısı 2 döndürdü. max ile deger = 5, a = 5; a < b, devam.
alfabeta("D") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [5, inf].
alfabeta(4) bir yaprak: 4 döner. min ile deger = 4, b = 4; a ≥ b.
a = 5 ≥ b = 4: break. D en fazla 4 verir; A zaten 5 değerini garanti etti. Yaprak 8 hiç okunmaz; D, 4 döndürür.
D çağrısı 4 döndürdü. max ile deger = 5, a = 5; a < b, devam; A bitti, 5 döner.
Program 5 yazdırır: A, B'ye giden hamleyi seçer. 7 yaprağın 5'i okundu; C'nin 9'u ve D'nin 8'i budandı. Minimaks da 5 bulur (C = 2, D = 4).
Adım Adım İzleme · MAX düğümünde budama
Soru 10: Kök MIN Olunca
Aynı kod bu kez kök MIN ile çağrılıyor (son satırda False); B, C, D birer MAX düğümü. Program ne yazdırır? Budama hangi düğümde olur?
from math import inf T = {"A": ["B", "C", "D"], "B": [3, 6], "C": [4, 7, 2], "D": [5, 1]} def alfabeta(n, a, b, maks): if isinstance(n, int): # yaprak return n deger = -inf if maks else inf for c in T[n]: v = alfabeta(c, a, b, not maks) if maks: deger = max(deger, v); a = max(a, deger) else: deger = min(deger, v); b = min(b, deger) if a >= b: break # budama return deger print(alfabeta("A", -inf, inf, False))
Kodun kurduğu ağaç: kök MIN, ikinci katman MAX. Henüz hiçbir yaprak okunmadı.
İlk çağrı: kök A bir MIN düğümü; deger = inf, a = -inf, b = inf.
alfabeta("B") çağrılır: MAX, deger = -inf; a ve b üst çağrıdan gelir: [-inf, inf].
alfabeta(3) bir yaprak: 3 döner. max ile deger = 3, a = 3; a < b, devam.
alfabeta(6) bir yaprak: 6 döner. max ile deger = 6, a = 6; a < b, devam; B bitti, 6 döner.
B çağrısı 6 döndürdü. min ile deger = 6, b = 6; a < b, devam.
alfabeta("C") çağrılır: MAX, deger = -inf; a ve b üst çağrıdan gelir: [-inf, 6].
alfabeta(4) bir yaprak: 4 döner. max ile deger = 4, a = 4; a < b, devam.
alfabeta(7) bir yaprak: 7 döner. max ile deger = 7, a = 7; a ≥ b.
a = 7 ≥ b = 6: break. C en az 7 verir; A zaten 6 değerini garanti etti. Yaprak 2 hiç okunmaz; C, 7 döndürür.
C çağrısı 7 döndürdü. min ile deger = 6, b = 6; a < b, devam.
alfabeta("D") çağrılır: MAX, deger = -inf; a ve b üst çağrıdan gelir: [-inf, 6].
alfabeta(5) bir yaprak: 5 döner. max ile deger = 5, a = 5; a < b, devam.
alfabeta(1) bir yaprak: 1 döner. max ile deger = 5, a = 5; a < b, devam; D bitti, 5 döner.
D çağrısı 5 döndürdü. min ile deger = 5, b = 5; a < b, devam; A bitti, 5 döner.
Program 5 yazdırır: kök MIN, D'ye giden hamleyi seçer. Budama yalnız C'de (bir MAX düğümünde) oldu: C'nin 2'si okunmadı. D'de budama yok: D'nin değeri 5, gelen [−∞, 6] aralığının içinde.
Hesaplama Sorusu · Elle alfa-beta
Soru 11: Elle Alfa-Beta
Kök A (MAX), B, C, D (MIN), E–J (MAX); çocuklar soldan sağa denenir.
a) Minimaksla kökün değeri ve MAX'ın hamlesi nedir?
b) Alfa-betada her iç düğüme hangi [α, β] aralığı gelir?
c) Hangi yapraklar budanır, kaç yaprak okunur?
Cevabı göster
a) E = 7, F = 9, B = 7; G = 5, H = 6, C = 5; I = 8, J = 9, D = 8. Kök = max(7, 5, 8) = 8, MAX D'yi seçer.
| Düğüm | Gelen [α, β] | Döner |
|---|---|---|
| B | [−∞, +∞] | 7 |
| E | [−∞, +∞] | 7 |
| F | [−∞, 7] | 9 |
| C | [7, +∞] | 5 |
| G | [7, +∞] | 5 |
| D | [7, +∞] | 8 |
| I | [7, +∞] | 8 |
| J | [7, 8] | 9 |
- F: 9 ≥ β = 7 → 3 budanır.
- C: G = 5 ile β = 5 ≤ α = 7 → H (1, 6) budanır.
- J: 9 ≥ β = 8 → 2 budanır.
c) On iki yapraktan 8'i okunur. F ve J'nin döndürdüğü 9 kesin değer değil, alt sınırdır. Kök D'de 7'den 8'e yükselir: D'nin değeri gelen aralığın içindedir.
Çoktan Seçmeli · Kod okuma
Soru 12
Alfa-beta kodundaki if a >= b: satırı if a > b: olarak değiştiriliyor. Ne olur?
Doğru cevap D. α = β iken düğümün değeri kökü değiştiremez: sonucu etkileyebilecek bir değer α ile β arasında kalmalıdır ve böyle bir değer yoktur. a > b bu durumda budamaz; kalan dallar boşuna okunur ama kök değeri değişmez. Örnek: kök MAX, B = [5, 7], C = [5, 9]. B = 5 ile α = 5; C'nin ilk yaprağı 5 ile β = 5. a >= b 9'u budar (3 yaprak), a > b okur (4 yaprak); iki kod da 5 bulur. α > β olunca budama sürer (B yanlış); koşul iki düğüm türünde aynı satırdır (C).
Çoktan Seçmeli · Knuth–Moore formülü
Soru 13
Her iç düğümün 5 çocuğu olan, derinliği 5 olan düzgün bir ağaçta çocuklar en iyi sırayla deneniyor. Alfa-beta kaç yaprak okur?
Doğru cevap C. En iyi sırada okunan yaprak sayısı b⌈d/2⌉ + b⌊d/2⌋ − 1'dir: 53 + 52 − 1 = 125 + 25 − 1 = 149. 3.125 = 55, budamasız aramanın ya da en kötü sıranın sayısıdır. 125 yalnız ilk terimdir; 250 ise 2 · 53'tür. d tek olduğunda iki üs farklıdır (3 ve 2). Minimaksın 3.125 yaprağına karşı yaklaşık 21 kat az okuma.
Adım Adım İzleme · Hamle sıralaması
Soru 14: Sıralama ve Okunan Yapraklar
Çocuklar en iyi sırada verilmiştir. Program ne yazdırır? En kötü sırada kaç yaprak okunurdu?
from math import inf T = {"A": ["B", "C", "D"], "B": [7, 9, 8], "C": [3, 8, 10], "D": [5, 12, 6]} okunan = [] def alfabeta(n, a, b, maks): if isinstance(n, int): # yaprak okunan.append(n) return n deger = -inf if maks else inf for c in T[n]: v = alfabeta(c, a, b, not maks) if maks: deger = max(deger, v); a = max(a, deger) else: deger = min(deger, v); b = min(b, deger) if a >= b: break # budama return deger print(alfabeta("A", -inf, inf, True), okunan)
Kodun kurduğu ağaç: kök MAX, ikinci katman MIN. Henüz hiçbir yaprak okunmadı.
İlk çağrı: kök A bir MAX düğümü; deger = -inf, a = -inf, b = inf.
alfabeta("B") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [-inf, inf].
alfabeta(7) bir yaprak: 7 döner. min ile deger = 7, b = 7; a < b, devam.
alfabeta(9) bir yaprak: 9 döner. min ile deger = 7, b = 7; a < b, devam.
alfabeta(8) bir yaprak: 8 döner. min ile deger = 7, b = 7; a < b, devam; B bitti, 7 döner.
B çağrısı 7 döndürdü. max ile deger = 7, a = 7; a < b, devam.
alfabeta("C") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [7, inf].
alfabeta(3) bir yaprak: 3 döner. min ile deger = 3, b = 3; a ≥ b.
a = 7 ≥ b = 3: break. C en fazla 3 verir; A zaten 7 değerini garanti etti. Yapraklar 8 ve 10 hiç okunmaz; C, 3 döndürür.
C çağrısı 3 döndürdü. max ile deger = 7, a = 7; a < b, devam.
alfabeta("D") çağrılır: MIN, deger = inf; a ve b üst çağrıdan gelir: [7, inf].
alfabeta(5) bir yaprak: 5 döner. min ile deger = 5, b = 5; a ≥ b.
a = 7 ≥ b = 5: break. D en fazla 5 verir; A zaten 7 değerini garanti etti. Yapraklar 12 ve 6 hiç okunmaz; D, 5 döndürür.
D çağrısı 5 döndürdü. max ile deger = 7, a = 7; a < b, devam; A bitti, 7 döner.
Çıktı: 7 [7, 9, 8, 3, 5]. 9 yapraktan 5'i okunur: 3 + 3 − 1 = 5. En kötü sırada (kökte C, D, B; yapraklar büyükten küçüğe) budama olmaz, 9 yaprağın hepsi okunur; kök yine 7.
Hesaplama Sorusu · Değerlendirme fonksiyonu
Soru 15: Dörtlü Bağla: E(s) Hesabı
E(s) = Σ p(w) + 3 · (Korta − Morta); pencere puanı: 3 kırmızı + 1 boş +5, 2 kırmızı + 2 boş +2, maviler için −5 ve −2, öteki pencereler 0. Kırmızı = MAX.
a) Bu konumda hangi pencereler puan alır, E(s) kaçtır?
b) Sıra Kırmızı'da; Kırmızı 5. sütuna oynarsa taş 2. satıra düşer. Yeni konumda E(s) kaçtır?
Cevabı göster
Kareler (sütun, satır), satır alttan. a) Yatay ve dikey pencerelerin hepsi iki renkli, tek taşlı ya da boştur: 0. Puan alan iki çapraz:
- (5, 1), (4, 2), (3, 3), (2, 4): iki kırmızı + iki boş → +2
- (6, 1), (5, 2), (4, 3), (3, 4): iki mavi + iki boş → −2
Orta sütun: 3 · (2 − 1) = +3. E(s) = 2 − 2 + 3 = +3.
b) Yeni taş (5, 2) mavi çaprazı iki renkli yapar: −2 kaybolur. +2 alan altı pencere: 2. satırda (2–5), (3–6), (4–7) yatayları; 5. sütunda (5, 1)–(5, 4) dikeyi; (4, 1)–(7, 4) ve (5, 1)–(2, 4) çaprazları. E(s) = 6 · 2 + 3 = +15.
Çoktan Seçmeli · Ufuk etkisi
Soru 16
Derinlik sınırlı arama yapan bir satranç programı, bir taşını kurtaramayacağını görünce boş yere şah çekerek taş kaybını arama sınırının ötesine itiyor. Bu olgunun adı ve onu en doğrudan azaltan yöntem nedir?
Doğru cevap B. Arama sınırın ötesini göremez; kaçınılmaz kaybı ufkun ötesine iten hamleler kaybı ortadan kaldırmaz, yalnız görünmez yapar: ufuk etkisi. Sınırdaki konumda taş alımı ya da şah gibi hareketli bir durum sürüyorsa arama yalnız bu hamlelerle sürdürülür ve konum sakinleşince değerlendirilir: sakinlik araması. Geçiş tablosu (C) aynı konumu tekrar aramamayı sağlar, ufku uzatmaz. Hamle sıralaması (A) ve budama koşulu (D) yalnız maliyeti değiştirir; kök değerini değiştirmez.
Hesaplama Sorusu · Ufuk etkisi
Soru 17: Derinlik 2 mi, Derinlik 3 mü?
Kırmızı (MAX) kökte. D, E, F, G derinlik 2'deki konumlardır; sağlarındaki sayı E(s). Yapraklar, derinlik 3'teki konumların E(s) değerleridir. Kesik çizgi derinlik 2 sınırıdır.
a) Derinlik 2 araması hangi hamleyi seçer, kök değeri nedir?
b) Derinlik 3 araması neyi seçer?
c) Fark neden doğar? Derinlik 3'ün değeri kesin midir?
Cevabı göster
a) Derinlik 2: B = min(+5, +7) = +5, C = min(+2, +4) = +2. Kök +5, seçim B.
b) Derinlik 3: D = max(−6, −8) = −6, E = +8, B = min(−6, +8) = −6; F = +3, G = +5, C = +3. Kök +3, seçim C.
c) D, derinlik 2'de +5 ile iyi görünür; oysa sıra Kırmızı'ya geldiğinde her hamlesi kötü bir konuma (−6, −8) gider. Derinlik 2 araması bunu sınırın ötesinde kaldığı için göremez: ufuk etkisi. Derinlik 3'ün değeri de bir tahmindir; ufuk yalnız bir yarım hamle uzaklaşmıştır.
Kod Yazma Sorusu · Negamaks
Soru 18: Negamaks ile Nim
Bir Nim konumu yığın boylarının demetidir, örneğin (1, 2, 3). Özyinelemeli minimaks koduyla aynı üslupta iki fonksiyon yazılacak:
deger(y): sıradaki oyuncu en iyi oyunla kazanıyorsa +1, kaybediyorsa −1 (negamaks).kazandiran(y): değeri −1 olan çocuk konumların listesi.
Şu üç satır ne yazdırır?
print(deger((1, 2)), deger((2, 2))) print(deger((1, 2, 3)), deger((2, 5))) print(kazandiran((2, 5)))
Cevabı göster
def cocuklar(y): # bütün hamlelerin sonuçları return [y[:i] + (y[i] - k,) + y[i+1:] for i in range(len(y)) for k in range(1, y[i] + 1)] def deger(y): # y: yığın boyları if sum(y) == 0: # hamle yok: P return -1 return max(-deger(z) for z in cocuklar(y)) def kazandiran(y): return [z for z in cocuklar(y) if deger(z) == -1] print(deger((1, 2)), deger((2, 2))) print(deger((1, 2, 3)), deger((2, 5))) print(kazandiran((2, 5)))
Çıktı:
1 -1 -1 1 [(2, 2)]
Bir çocuk −1 ise max(−değer) = +1 (N); bütün çocuklar +1 ise −1 (P). (2, 5)'te tek kazandıran hamle ikinci yığını 2'ye indirmektir: 2 ⊕ 5 = 7, 5 ⊕ 7 = 2. Aynı konumlar tekrar tekrar aranır; functools.lru_cache her konumu bir kez hesaplatır (geçiş tablosu).