IlmHamroh
JavaScript Full-stack/3-qism. Dasturchi asboblari va fikrlash5/21-dars11 daqiqa
Mundarija (33)

Muammo yechish metodikasi: Polya'ning 4 qadami va tiqilib qolganda nima qilish

Qisqacha: Har qanday masala to'rt qadamda yechiladi: avval uni tushunasiz, keyin reja tuzasiz, rejani bajarasiz va natijani tekshirasiz. Bu usulni matematik Dyord Polya 1945-yilda yozgan. Tiqilib qolsangiz — masalani kichraytiring, uni ovoz chiqarib tushuntiring yoki tanaffus qiling.

Bu darsda

  • Polya'ning 4 qadami bilan masalani tartibli yecha olasiz.
  • Masaladan kirish, chiqish va cheklovlarni ajrata olasiz.
  • Yechim yozishdan oldin qo'lda misollar tuza olasiz.
  • Algoritmni qo'lda kuzatib (dry run), xatoni kod yozmasdan topa olasiz.
  • Tiqilib qolganda qiladigan 5 ta ishni bilasiz.

Oldin bilishingiz kerak: Pseudokod va uch g'isht, Blok-sxema va diagramma vositalari.

1. Nega bu kerak?

Oldingi darslarda algoritm yozish vositalarini o'rgandik: pseudokod va blok-sxema. Endi savol: masala berilganda qayerdan boshlash kerak?

Har bir dasturchi shunday kunni boshdan kechiradi. Vazifa berildi, siz darhol yozishga tushdingiz. Oradan uch soat o'tdi, hech narsa ishlamayapti. Qayerda adashganingizni o'zingiz ham bilmaysiz.

Buning sababi ko'pincha bilim yetishmasligi emas. Sababi — tartibsiz yondashuv: masalani tushunmasdan yozish, tekshirmasdan davom etish.

Tajribali dasturchilarda oddiy qoida bor: "Sekin o'ylang, tez yozing." Bu darsda shu qoidani qadamlarga aylantiramiz.

2. Polya'ning 4 qadami

2.1 Usulning o'zi

1945-yilda vengriyalik matematik Dyord Polya (George Pólya) "How to Solve It" ("Masalani qanday yechish kerak") degan kitob yozdi. Unda har qanday masalani yechish uchun to'rt qadam bor:

flowchart TD
    A[1. Tushunish] --> B[2. Reja tuzish]
    B --> C[3. Bajarish]
    C --> D[4. Ortga qarash]
    D -- Xato topildi --> A
Qadam Asosiy savol
1. Tushunish Nima beriladi? Nima kerak?
2. Reja tuzish Qanday yechaman? O'xshash masala ko'rganmanmi?
3. Bajarish Rejani qadamma-qadam yozdimmi?
4. Ortga qarash Natija to'g'rimi? Hamma holatda ishlaydimi?

Chizmadagi orqaga qaytgan strelkaga e'tibor bering. Tekshiruvda xato chiqsa, boshiga qaytasiz. Bu mag'lubiyat emas — usulning bir qismi.

Polya kitobini matematika masalalari uchun yozgan. Lekin bu qadamlar dasturlashga ham aynan mos keladi, shuning uchun dasturchilar uni hozir ham ishlatadi.

3. 1-qadam: masalani tushunish

3.1 Uch savol

Masalani o'qigach, o'zingizga uch savol bering:

  1. Menga nima beriladi? Bu — kirish.
  2. Men nima qaytarishim kerak? Bu — chiqish.
  3. Qanday cheklovlar bor? Masalan: son manfiy bo'lishi mumkinmi? Ro'yxat bo'sh bo'lishi mumkinmi?

Birinchi ikki savolni algoritm darsida ko'rgan edik. Uchinchisi yangi va eng ko'p unutiladigani.

3.2 O'z so'zingiz bilan aytib bering

Masalani o'qib, kitobga qaramasdan, o'z so'zingiz bilan aytib ko'ring. Ayta olmasangiz — hali tushunmagansiz. Bunday holatda kod yozishni boshlash — manzilni bilmay taksiga o'tirishdek gap.

3.3 Qo'lda misollar tuzing

Tushunishning eng kuchli usuli — yechim yozishdan oldin bir nechta misolni qo'lda hisoblash.

Masala: "Sinfdagi o'quvchilar baholarining o'rtachasini toping."

  • Oddiy misol: baholar 5, 4, 3 → o'rtacha (5 + 4 + 3) ÷ 3 = 4.
  • Kichik misol: bitta baho 5 → o'rtacha 5.
  • Chekka misol: baho umuman yo'q → o'rtacha ... nechchi?

Uchinchi misol ustida to'xtab qoldingiz, to'g'rimi? Bo'sh ro'yxatning o'rtachasini hisoblab bo'lmaydi: 0 ni 0 ga bo'lish ma'nosiz. Demak masalada javobi yo'q savol bor. Buni vazifa bergan odamdan so'rash kerak: "Baho yo'q bo'lsa nima chiqaray?"

Aynan shunday savollarni misol tuzish ochib beradi. Kod yozib bo'lgach topilsa, ancha qimmatga tushardi.

Tekshirib ko'ring: "Tug'ilgan yilga qarab yoshni hisoblang" masalasining kirishi, chiqishi va bitta cheklovini ayting.

Javob

Kirish: tug'ilgan yil. Chiqish: yosh (yil hisobida). Cheklov misoli: tug'ilgan yil kelajakda bo'lishi mumkin emas (masalan, 2090). Yana bir savol: bu yil tug'ilgan kuni o'tganmi? Uni ham aniqlashtirish kerak — aks holda javob 1 yilga adashishi mumkin.

4. 2-qadam: reja tuzish

Reja tuzishda shu savollar yordam beradi:

  • Bunga o'xshash masalani ko'rganmanmi? Kompyutercha fikrlash darsidagi naqsh g'oyasi shu. Choyxona chekida "jamini 0 dan boshlab, har birini qo'shish" qilgan edik. O'rtacha baho uchun ham aynan shu kerak.
  • Masalani bo'laklasa bo'ladimi? O'rtacha = yig'indi ÷ soni. Demak ikki kichik ish: yig'indini topish va sonini sanash.
  • Soddaroq versiyasini yecha olamanmi? 100 ta baho qo'rqitsa, avval 3 ta baho uchun yeching.

Reja — pseudokod yoki blok-sxema. Qaysi biri qulay bo'lsa, shuni tanlang.

5. 3-qadam: rejani bajarish

Bu qadamda rejani yechimga aylantirasiz. Hozircha — batafsil pseudokodga, keyinchalik esa haqiqiy kodga.

Bitta muhim odat: hammasini yozib bo'lib, keyin tekshirmang. Kichik bo'lak yozing, tekshiring, keyingisiga o'ting. Katta devorni ham g'ishtma-g'isht teramiz va har qatordan keyin shovun bilan tekislaymiz.

6. 4-qadam: ortga qarash

6.1 Misollar bilan tekshirish

1-qadamda tuzgan misollaringizni oling va yechimni qo'lda "bajaring". Har bir o'zgaruvchi qiymatini jadvalga yozib boring.

Bu pseudokod darsida ko'rgan qo'lda kuzatish (tracing). Uni dry run ham deyishadi — inglizcha "quruq yugurish", ya'ni kompyutersiz, qog'ozda bajarish.

Qo'lda natija misoldagi javob bilan chiqmasa, xato rejada yoki bajarishda. Qaysi qatorda qiymat kutilganidan boshqacha bo'lganini jadval ko'rsatib beradi.

6.2 Yaxshilash mumkinmi?

Yechim to'g'ri ishlasa, yana ikki savol bering:

  • Soddaroq yozsa bo'ladimi? Ortiqcha qadam yo'qmi?
  • Bu yechimni boshqa masalada ham ishlatsa bo'ladimi?

Ikkinchi savol sizni kelajakda tezlashtiradi: har yechilgan masala keyingisi uchun tayyor naqshga aylanadi.

7. Hammasi birga: o'rtacha baho

7.1 To'liq yechilgan misol

1. Tushunish. Kirish: baholar ro'yxati. Chiqish: o'rtacha baho. Cheklov: ro'yxat bo'sh bo'lishi mumkin — vazifa beruvchi "Baho yo'q" deb chiqarishni so'radi.

2. Reja. O'rtacha = yig'indi ÷ soni. Yig'indini "0 dan boshlab qo'shish" naqshi bilan, sonini sanagich bilan topamiz.

3. Bajarish:

text
baholar = [5, 4, 3, 5]
AGAR baholar bo'sh BO'LSA
    CHIQAR "Baho yo'q"
AKS HOLDA
    yigindi = 0
    soni = 0
    HAR BIR baho UCHUN baholar ichida
        yigindi = yigindi + baho
        soni = soni + 1
    CHIQAR yigindi / soni

/ — bo'lish belgisi, dasturlashda ÷ o'rniga shu yoziladi.

4. Ortga qarash. Qo'lda kuzatamiz:

baho yigindi soni
boshida 0 0
5 5 1
4 9 2
3 12 3
5 17 4

Natija: 17 ÷ 4 = 4.25. Qo'lda hisoblasak ham shunday: (5 + 4 + 3 + 5) ÷ 4 = 4.25. To'g'ri!

Endi chekka holatlar: bitta baho [5] → 5 ÷ 1 = 5, to'g'ri. Bo'sh ro'yxat → "Baho yo'q", to'g'ri. Agar AGAR shartini unutganimizda, 0 ÷ 0 ni hisoblashga urinardik.

7.2 Qisman yechilgan misol

Shu algoritmni baholar = [3, 5, 4] bilan o'zingiz kuzating. Oxirida yigindi = 12, soni = 3 bo'ladi. Natija nechchi?

8. Tiqilib qolganda nima qilish kerak?

Eng yaxshi usul bilan ham ba'zan tiqilib qolasiz. Bu normal. Mana beshta sinalgan yo'l.

8.1 Kauchuk o'rdak usuli

O'rganish usullari darsida kauchuk o'rdak usuli (rubber duck debugging) bilan tanishgansiz. Stolga o'yinchoq o'rdak qo'yasiz va yechimingizni unga qatorma-qator, ovoz chiqarib tushuntirasiz.

U yerda bu usulni yangi mavzuni o'rganish uchun ishlatgan edik. Asli esa xato topish uchun o'ylab topilgan. Usul "The Pragmatic Programmer" (1999) kitobidagi hikoyadan tarqalgan: dasturchi o'rdakka kodini tushuntirib, xatosini o'zi topgan.

Nega ishlaydi? Ichingizda o'ylaganda miya bo'shliqlarni sezmay o'tib ketadi. Ovoz chiqarib tushuntirganda esa har qadamni aniq aytishga majbursiz. "Bu yerda sanagich oshadi... e, oshirishni yozmabman-ku!" — xato o'z-o'zidan chiqib keladi.

8.2 Masalani kichraytiring

1000 ta element bilan ishlamayaptimi? 2 ta element bilan sinab ko'ring. Kichik misolda nima bo'layotganini boshda kuzatish mumkin.

8.3 Oraliq qiymatlarni ko'ring

Qo'lda kuzatish jadvalining kompyuterdagi ko'rinishi — har qadamda o'zgaruvchi qiymatini ekranga chiqarish. Bash'da buni echo "$yigindi" bilan qilasiz. JavaScript'da esa console.log(...) bilan — u qavs ichidagi qiymatni konsolga yozadi (uni 08-qismda o'rganamiz). Qaysi qadamda qiymat kutilganidan boshqacha bo'lsa — xato o'sha yerda.

8.4 Tanaffus qiling

15 daqiqa sayr qiling yoki choy iching. Miya dam olayotganda ham masala ustida "orqa fonda" ishlashda davom etadi. Ko'p dasturchi yechimni dush ostida yoki yo'lda topganini aytadi.

8.5 Yordam so'rang

15–20 daqiqa hech qanday siljish bo'lmasa — so'rang. Hamkasb, ustoz yoki jamoa chati. Yaxshi savol berishni yordam so'rash darsida o'rganamiz. Qizig'i shundaki, savolni aniq yozayotganda ko'pincha javobni o'zingiz topasiz — bu ham kauchuk o'rdakning bir turi.

Tekshirib ko'ring: Kauchuk o'rdak usulida o'rdak nima uchun kerak? U javob bermaydi-ku.

Javob

O'rdak javob berishi shart emas. Uning vazifasi — sizni fikrni ovoz chiqarib, har qadami bilan aytishga majburlash. Xatoni aynan shu tushuntirish jarayonida o'zingiz topasiz.

9. Ko'p uchraydigan xatolar

9.1 Masalani tushunmasdan yozish

Shartni shoshib o'qib, boshqa narsani hisoblaydigan yechim yoziladi. Butun mehnat bekor ketadi. Yechim: masalani o'z so'zingiz bilan qayta ayting va misollar tuzing.

9.2 Tasodifiy o'zgartirishlar

Xato chiqdi — siz o'ylamasdan bir narsani o'zgartirasiz, keyin boshqasini, keyin yana boshqasini. Birortasi ishlab ketar degan umid. Bu vaqtni yeydi va yangi xatolar qo'shadi. Yechim: avval nega ishlamayotganini tushuning, keyin bitta aniq o'zgartirish qiling.

9.3 Hammasini birdan tuzatish

Uchta xato topdingiz va uchalasini birdan tuzatdingiz. Endi natija o'zgardi, lekin qaysi tuzatish ta'sir qilganini bilmaysiz. Yechim: bitta tuzating, tekshiring, keyin keyingisiga o'ting.

9.4 Faqat bitta misolda tekshirish

Yechim "5, 4, 3" bilan ishladi — tamom, deb o'ylash. Bo'sh ro'yxat bilan esa buzilardi. Yechim: har doim oddiy, kichik va chekka misolni sinang.

10. Mashqlar

1-mashq (oson): Kirish va chiqish

Har bir vazifa uchun kirish va chiqishni aniqlang:

  1. Tug'ilgan yilga qarab yoshni hisoblash.
  2. Matnda nechta so'z borligini sanash.
  3. Kiritilgan son juftmi yoki toqmi — aniqlash.
Yechim
  1. Kirish: tug'ilgan yil (son). Chiqish: yosh (son).
  2. Kirish: matn. Chiqish: so'zlar soni (butun son).
  3. Kirish: son. Chiqish: "juft" yoki "toq" — ya'ni ikki javobdan biri.

Uchinchi vazifaning chiqishi son emas, balki "ha yoki yo'q" turidagi javob. Bunday javoblarni keyinroq "mantiqiy qiymat" deb ataymiz.

2-mashq (o'rta): Qo'lda kuzating

Quyidagi pseudokodni n = 4 bilan qo'lda kuzating. Har aylanishda i va kopaytma ni jadvalga yozing.

text
n = 4
kopaytma = 1
i = 1
TOKI i <= n EKAN
    kopaytma = kopaytma * i
    i = i + 1
CHIQAR kopaytma
Yechim
i kopaytma
boshida (1) 1
1 1 × 1 = 1
2 1 × 2 = 2
3 2 × 3 = 6
4 6 × 4 = 24

i 5 ga yetganda 5 <= 4 yolg'on bo'ladi va takror to'xtaydi. Natija: 24.

Bu algoritm 1 × 2 × 3 × 4 ni hisoblaydi. Matematikada bu "4 faktorial" deyiladi va 4! deb yoziladi.

3-mashq (qiyin): Do'kon chegirmasi

Do'konda qoida: xarid 200 000 so'mdan oshsa, 10% chegirma beriladi. Polya'ning 4 qadami bo'yicha yeching:

  1. Kirish, chiqish va kamida bitta savolni yozing.
  2. Kamida 3 ta misolni qo'lda hisoblang.
  3. Pseudokod yozing.
  4. Misollaringiz bilan qo'lda tekshiring.

Ishora: 10% ni hisoblash — summani 10 ga ko'paytirib, 100 ga bo'lish (summa * 10 / 100).

Yechim

1. Tushunish. Kirish: xarid summasi. Chiqish: to'lanadigan summa. Savol: xarid aynan 200 000 bo'lsa-chi? "Oshsa" — demak 200 000 ning o'zida chegirma yo'q. Bunday joyni albatta aniqlashtiring.

2. Misollar:

  • 100 000 → chegirma yo'q → 100 000.
  • 300 000 → 10% = 30 000 → 270 000.
  • 200 000 → oshmagan → 200 000.

3. Pseudokod:

text
KIRIT summa
AGAR summa > 200000 BO'LSA
    tolov = summa - summa * 10 / 100
AKS HOLDA
    tolov = summa
CHIQAR tolov

4. Tekshiruv. 300 000: shart rost, 300 000 − 30 000 = 270 000 — mos. 200 000: 200 000 > 200 000 yolg'on, tolov = 200 000 — mos. 100 000 — mos.

Agar shartda > o'rniga >= yozilganida, 200 000 misoli xatoni darhol ushlardi. Chegaradagi misol aynan shuning uchun kerak.

11. Real ishda

  • Vazifa olganda. Tajribali dasturchi vazifani olgach, darhol yozmaydi. Avval savollar beradi: "Bo'sh bo'lsa nima bo'ladi?", "Bu cheklov qayerdan?" Bu savollar keyinchalik haftalab qayta ishlashdan qutqaradi.
  • Intervyu. Texnik suhbatda baholovchilar natijadan ko'ra fikrlash jarayoniga qaraydi. Masalani qayta aytish, misol so'rash, reja aytish — live coding intervyu darsida shularni mashq qilasiz.
  • Xato qidirish. Kauchuk o'rdak, masalani kichraytirish va oraliq qiymatlarni ko'rish — debugging metodologiyasi darsida kengaytiriladi.

Xulosa

  • Polya'ning 4 qadami: tushunish → reja → bajarish → ortga qarash.
  • Tushunish uchun uch savol: nima beriladi, nima kerak, qanday cheklovlar bor.
  • Yechimdan oldin oddiy, kichik va chekka misollarni qo'lda hisoblang.
  • Qo'lda kuzatish (dry run) — xatoni kod yozmasdan topish usuli.
  • Tiqilib qolsangiz: kauchuk o'rdak, masalani kichraytirish, oraliq qiymatlar, tanaffus, yordam so'rash.

Keyingi dars: Chegaraviy holatlar, brute force va invariant — yechim chekka holatlarda ham buzilmasligini, avval oddiy, keyin tez yechim yozishni va algoritm to'g'riligini isbotlashni o'rganamiz.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Muammo yechish metodikasi: Polya'ning 4 qadami va tiqilib qolganda nima qilish — IlmHamroh