01 β Algoritm nima va uning xossalari¶
π README Β· Keyingi: 02 β Algoritmni tasvirlash: blok-sxema, psevdokod, trassirovka β‘οΈ
Bu bobda: "Algoritm" so'zi qayerdan kelganini (Muhammad al-Xorazmiy), uning aniq ta'rifini va algoritm bo'lishi uchun zarur bo'lgan 5 ta xossani o'rganamiz. Algoritm bilan dastur va funksiya farqini ajratamiz, bitta masalaga bir nechta algoritm bo'lishini ko'ramiz va "yaxshi algoritm" nima ekanini muhokama qilamiz.
Halollik / Eslatma: Bu bob β kirish bob, shuning uchun matematik isbotlar yo'q; lekin har bir tushuncha misol va anti-misol bilan beriladi. Bobdagi barcha Python namunalari haqiqatan ishga tushirib, chiqishi tekshirilgan. "Murakkablik" so'zini bu yerda faqat sezgi darajasida ishlatamiz β uning matematik ta'rifi keyingi qismda (08-bob).
Algoritm β kompyuterdan ham qadimiy g'oya¶
Tasavvur qiling, do'stingizdan choy damlab berishini so'radingiz. Lekin u choy damlashni umuman bilmaydi. Siz unga shunday tushuntirasiz:
1. Choynakka 1 qoshiq choy sol.
2. Suvni qaynaguncha qizdir.
3. Qaynoq suvni choynakka quy.
4. 5 daqiqa kutib, damlanishini kut.
5. Piyolaga quy β tayyor.
Mana shu β algoritm. Siz biror muammoni (choy yo'q) yechish uchun aniq, tartibli qadamlar ketma-ketligini berdingiz. Har kim bu qadamlarni ketma-ket bajarsa, natija bir xil bo'ladi: damlangan choy.
E'tibor bering β bu yerda hech qanday kompyuter, hech qanday dasturlash tili yo'q. Algoritm β bu sintaksis emas, fikr. Retsept, mashina yig'ish yo'riqnomasi, "uydan ishxonagacha qanday borish" yo'l-yo'rig'i β bularning hammasi algoritm. Kompyuter shunchaki algoritmlarni juda tez va xatosiz bajaradigan mashina, xolos.
"Algoritm" so'zi qayerdan kelgan?¶
So'zning o'zi bir buyuk olimning ismidan kelib chiqqan. IX asrda (taxminan 780β850-yillar) yashagan Muhammad ibn Muso al-Xorazmiy β Xorazmdan chiqqan matematik, astronom va geograf β Bag'doddagi "Donishmandlik uyi"da ishlagan. U o'nlik sanoq sistemasi va sonlar ustida amallar bajarish qoidalari haqida mashhur asar yozgan.
Keyinchalik bu asar lotinchaga tarjima qilinganda, muallifning nomi lotincha "Algorithmi" shaklida yozilgan. Vaqt o'tib, "Algorithmi dixit" ("Al-Xorazmiy aytadi") iborasidagi bu so'z aniq qoidalar bo'yicha hisoblash usulini anglatadigan "algoritm" atamasiga aylangan. Ya'ni siz har kuni ishlatadigan bu so'z β bevosita Xorazmlik bobokalonimiz nomidan.
Eslatma: "Algebra" so'zi ham xuddi shu olimning asari nomidan ("al-jabr") kelib chiqqan. Bitta inson ikkita asosiy atamaga nom bergan.
Algoritmning aniq ta'rifi¶
Endi sezgidan aniqlikka o'tamiz. Rasmiy ta'rif:
Algoritm β bu biror muammoni yechish yoki maqsadga erishish uchun belgilangan, aniq (bir ma'noli) va cheklangan qadamlar ketma-ketligi. U kirish ma'lumotlarini (bo'lishi mumkin) qabul qilib, ularni qayta ishlab, chiqish (natija) beradi.
Bu ta'rifda har bir so'z muhim:
- Qadamlar β kichik, tushunarli amallar.
- Ketma-ketlik β tartib bor; qadamlar ma'lum izchillikda bajariladi.
- Aniq β har qadam bir ma'noli, hech qanday taxminga o'rin yo'q.
- Cheklangan β qadamlar soni cheksiz emas, algoritm bir kun to'xtaydi.
- Muammoni yechadi β algoritm bekorga emas, aniq maqsad uchun.
Bu ta'rifning yuragida "qora quti" g'oyasi yotadi: algoritmga biror narsa kiritamiz, u ishlaydi va bizga natija qaytaradi. Hatto ichida nima bo'layotganini bilmasak ham, kirish va chiqishni ko'rsata olamiz.
Algoritmning 5 ta xossasi¶
Endi eng muhim qismga keldik. Har qanday qadamlar ketma-ketligi algoritm bo'la olmaydi. Klassik ta'rifga ko'ra (uni informatika asoschilaridan biri Donald Knut umumlashtirgan), haqiqiy algoritm 5 ta xossaga ega bo'lishi shart.
Har birini misol va anti-misol bilan ko'rib chiqamiz β chunki nimanidir tushunishning eng yaxshi yo'li, u bo'lmaganda nima sodir bo'lishini ko'rishdir.
1. Aniqlik / determinizm (har qadam bir ma'noli)¶
Har bir qadam shunchalik aniq bo'lishi kerakki, uni o'qigan ikki kishi (yoki kompyuter) bir xil tushunsin va bir xil harakat qilsin. Hech qanday "o'zing hal qil", "biroz", "kerak bo'lsa" kabi noaniqlikka o'rin yo'q.
- β Yaxshi: "Suvni 100 darajagacha qizdir." β aniq.
- β Yomon (anti-misol): "Suvni biroz qizdir." β biroz qancha? 40Β°? 80Β°? Ikki kishi turlicha tushunadi. Bu noaniq qadam.
Oshpazlik tilida "ta'mga qarab tuz qo'sh" degan ko'rsatma odamga tushunarli, lekin algoritm uchun yaroqsiz, chunki "ta'm" o'lchanmagan, har kimda har xil. Algoritm β taxmin emas, aniqlik.
Diqqat: "Determinizm" so'zi shuni anglatadiki, bir xil kirish bilan algoritm har doim bir xil yo'ldan boradi va bir xil natija beradi. (Keyinchalik tasodifiylikdan foydalanadigan algoritmlarni ham ko'rasiz, lekin asosiy holatda determinizm β kuchli talab.)
2. Cheklilik (finiteness β to'xtashi shart)¶
Algoritm cheklangan sondagi qadamdan keyin albatta to'xtashi kerak. U abadiy ishlab tura olmaydi.
- β Yaxshi: "1 dan 100 gacha sonlarni chop et." β 100 qadamdan keyin tugaydi.
- β Yomon (anti-misol): "1 dan boshlab to'xtamasdan sonlarni chop etaver." β bu hech qachon tugamaydi. Bu cheksiz sikl, va u algoritm emas.
Cheksiz sikl β dasturchilar tez-tez uchratadigan xato. Quyidagi psevdokodga qarang:
x <- 1
takrorla (x > 0 bo'lganda):
chop et x
x <- x + 1 # x doim o'sadi -> sharti hech qachon yolg'on bo'lmaydi
Bu yerda x doim ortib boradi, demak x > 0 sharti hech qachon buzilmaydi. Sikl to'xtamaydi β bu xossa buzilgan. Algoritm har doim "tugash nuqtasi"ga ega bo'lishi kerak.
Isbot (eskiz): Algoritm to'xtashini ko'rsatishning bir yo'li β har bir takrorlanishda nolga yaqinlashayotgan kamayuvchi kattalikni topish (masalan, "qolgan elementlar soni"). Agar bu kattalik har qadamda kamaysa va manfiy bo'lolmasa, demak sikl bir kun to'xtaydi. Bu g'oyani 05-bobda "sikl invarianti" bilan birga chuqurroq ko'ramiz.
3. Kirish (input) β 0 yoki undan ko'p¶
Algoritm tashqaridan noldan ko'p ma'lumot qabul qilishi mumkin. Diqqat: nolta kirish ham joiz.
- Ko'p kirishli: "Berilgan sonlar ro'yxatidan eng kattasini top." β kirish: sonlar ro'yxati.
- Nolta kirishli: "Birinchi 10 ta tub sonni chop et." β bu algoritm hech narsa olmaydi, lekin baribir ishlaydi.
Asosiysi β kirish aniq belgilangan bo'lishi kerak: qancha va qanday turdagi ma'lumot kutilishi oldindan ma'lum.
4. Chiqish (output) β kamida 1 natija¶
Algoritm kamida bitta natija ishlab chiqarishi shart. Hech narsa qaytarmaydigan "algoritm" β befoyda, chunki algoritm maqsadga xizmat qiladi.
- "Eng katta sonni top" β chiqish: bitta son.
- "Ro'yxatni saralash" β chiqish: saralangan ro'yxat.
Chiqish kirishga bevosita bog'liq bo'lishi va aniq ta'riflangan bo'lishi kerak: shu kirish uchun qanday natija to'g'ri ekani oldindan ma'lum.
5. Samaradorlik / bajariluvchanlik (har amal real bajarilishi mumkin)¶
Har bir qadam shu darajada oddiy va aniq bo'lishi kerakki, uni cheklangan vaqtda, mavjud vositalar bilan haqiqatan bajarib bo'lsin. Sehrli yoki imkonsiz amal β algoritm qadami emas.
- β Yaxshi: "Ikki sonni qo'sh." β bajariladigan amal.
- β Yomon (anti-misol): "Eng baxtli kunni tanla." β "baxt"ni o'lchab bo'lmaydi, bu amal aniq bajarilmaydi.
- β Yomon: "Berilgan haqiqiy sonni cheksiz aniqlikda yoz." β cheksiz raqamni yozib bo'lmaydi.
Eslatma: Ba'zi manbalarda bu xossani "bajariluvchanlik" (effectiveness), boshqalarida "elementarlik" deb ataydi. Mohiyat bitta: har qadam sodda, real va aniq ijro etiladigan amal bo'lsin.
Hammasi birga ishlaydi¶
Bu 5 xossa alohida emas β birga ishlaydi. Bitta yetishmasa, sizda to'liq algoritm yo'q:
| Xossa | Buzilsa nima bo'ladi |
|---|---|
| Aniqlik | Har kim turlicha bajaradi, natija bashorat qilib bo'lmaydi |
| Cheklilik | To'xtamaydi (cheksiz sikl) |
| Kirish | Nima bilan ishlashi noma'lum |
| Chiqish | Natija yo'q β befoyda |
| Bajariluvchanlik | Qadamni umuman bajarib bo'lmaydi |
Algoritm vs dastur vs funksiya¶
Bu uchta tushuncha tez-tez aralashtiriladi. Ularni aniq ajratamiz:
- Algoritm β bu g'oya. Muammoni yechish usulining mavhum, tildan mustaqil tavsifi. Uni qog'ozda, psevdokodda yoki blok-sxemada ifodalash mumkin. Algoritm hech qanday tilga bog'lanmaydi.
- Dastur β bu kod. Algoritmni biror dasturlash tilida (Python, C, Java...) yozib chiqqaningiz β endi u kompyuter bajara oladigan dastur. Bitta algoritmni Python, JavaScript yoki C da yozsangiz β uchta turli dastur, lekin bitta algoritm.
- Funksiya β bu kodning bo'lagi. Dastur ichidagi, biror vazifani bajaradigan nomlangan blok. Funksiya ko'pincha bitta algoritmni o'rab turadi, lekin "funksiya" β bu tilning tuzilma birligi, "algoritm" esa g'oya.
G'OYA (algoritm)
"eng katta sonni topish uchun ro'yxatni bir marta aylanib chiq,
yo'l-yo'lakay eng kattasini eslab bor"
|
| shu g'oyani kodga aylantiramiz
v
KOD (dastur / funksiya)
def eng_katta(sonlar): ... # Python da
function engKatta(sonlar)... // JavaScript da
Trade-off: Aynan shu sabab bu kitob til-mustaqil. Agar siz algoritmni g'oya sifatida tushunsangiz, uni istalgan tilda yoza olasiz. Agar faqat bitta tildagi kodni yodlasangiz β boshqa tilga o'tganda yana noldan boshlaysiz. Shuning uchun biz avval g'oyani, keyin kodni o'rganamiz.
Bir masala β ko'p algoritm¶
Muhim haqiqat: bitta masalani ko'p xil algoritm bilan yechish mumkin. "To'g'ri" javob bitta bo'lsa-da, unga borishning bir nechta yo'li bor.
Misol: sonlar ro'yxatidan eng kattasini topish.
1-yo'l β bitta marta aylanib chiqish. Birinchi sonni "hozircha eng katta" deb olamiz, qolganlarini birma-bir tekshiramiz; agar kattaroq son uchrasa, "eng katta"ni yangilaymiz.
2-yo'l β ro'yxatni saralab, oxirgisini olish. Avval butun ro'yxatni o'sish tartibida saralaymiz, keyin eng oxirgi (eng katta) elementni olamiz.
Ikkalasi ham to'g'ri natija beradi. Lekin ular bir xil emas: birinchi yo'l ro'yxatni faqat bir marta aylanib chiqadi, ikkinchisi esa avval butun ro'yxatni saralaydi β bu esa ancha ko'proq ish. Kichik ro'yxatda farq sezilmaydi; ammo million elementli ro'yxatda birinchi yo'l sezilarli tez bo'ladi.
Mana shu yerda tabiiy savol tug'iladi: "Qaysi algoritm yaxshiroq?" Bu savolga aniq, matematik javob berish β bu butun kitobning markaziy mavzularidan biri. Algoritmlarni qanchalik tez ishlashiga qarab solishtirishni biz murakkablik tahlili orqali o'rganamiz (07-bob va 08-bob). Hozircha shuni eslab qoling: to'g'ri bo'lish β yetarli emas; algoritm yana samarali ham bo'lishi kerak.
Kichik Python misol: algoritmni kodga aylantirish¶
G'oyani amalda ko'raylik. Avval psevdokod, keyin uni Python ga aylantiramiz va haqiqatan ishlatib tekshiramiz.
Misol 1 β ikki sonning kattasini topish¶
Psevdokod:
Python da:
def kattasi(a, b):
if a >= b:
return a
else:
return b
print(kattasi(7, 4)) # -> 7
print(kattasi(3, 9)) # -> 9
Diqqat: bu algoritm 5 xossani qanoatlantiradi β har qadam aniq (a >= b taqqoslash bir ma'noli), cheklangan (ikkita shart, sikl yo'q), kirishi bor (a, b), chiqishi bor (bitta son), va har amal real bajariladi.
Misol 2 β ro'yxatdagi eng katta son (1-yo'l)¶
Yuqorida muhokama qilgan "bir marta aylanib chiqish" g'oyasini kodga aylantiramiz:
def eng_katta(sonlar):
eng = sonlar[0] # birinchisini eng katta deb olamiz
for x in sonlar[1:]: # qolganini ko'rib chiqamiz
if x > eng:
eng = x
return eng
print(eng_katta([7, 2, 9, 4])) # -> 9
print(eng_katta([5])) # -> 5
print(eng_katta([-3, -8, -1])) # -> -1
Bitta elementli ro'yxatda ham ([5]), faqat manfiy sonlarda ham ([-3, -8, -1] β -1) to'g'ri ishlaydi. Diqqat: agar "eng katta"ni 0 deb boshlaganimizda, manfiy sonlarda xato chiqardi β shuning uchun ro'yxatning birinchi elementidan boshladik. Bu β algoritmni tuzishda muhim mayda detal.
Misol 3 β ro'yxat yig'indisi (akkumulyator usuli)¶
Yana bir juda keng tarqalgan naqsh β natijani bo'sh "idish"da to'plab borish (akkumulyator):
def yigindi(sonlar):
jami = 0
for x in sonlar:
jami = jami + x
return jami
print(yigindi([7, 2, 9, 4])) # -> 22
print(yigindi([])) # -> 0
Bu yerda bo'sh ro'yxat ([]) kirishi ham to'g'ri ishlaydi va 0 qaytaradi β bu "0 yoki undan ko'p kirish" xossasining yaxshi misoli.
Eslatma: Yuqoridagi uch namuna ham haqiqatan ishga tushirilib, har bir
# ->izohidagi chiqish tekshirilgan. Kodni o'zingiz ham ishlatib ko'ring β algoritmni qog'ozda yoki kompyuterda kuzatish, uni o'rganishning eng samarali yo'li.
Trassirovka β algoritmni "qo'lda" bajarish¶
Algoritm to'g'ri ishlashiga ishonch hosil qilishning eng kuchli usuli β uni kompyuterga o'xshab, qadamba-qadam o'zingiz bajarish. Buni trassirovka deyiladi: har qadamda o'zgaruvchilar qiymatini jadvalga yozib boramiz.
eng_katta([7, 2, 9, 4]) ni trassirovka qilamiz. Boshida eng = 7 (birinchi element), keyin 2, 9, 4 ni birma-bir tekshiramiz:
| Qadam | Ko'rilayotgan x |
x > eng ? |
eng (qadamdan keyin) |
|---|---|---|---|
| Boshlang'ich | β | β | 7 |
| 1 | 2 | 2 > 7 β yo'q | 7 |
| 2 | 9 | 9 > 7 β ha | 9 |
| 3 | 4 | 4 > 9 β yo'q | 9 |
Sikl tugadi, eng = 9 qaytariladi β to'g'ri. Mana shu oddiy jadval algoritm xatti-harakatini "ochib" beradi: ko'z bilan ko'rib turibsiz, har qadamda nima o'zgaradi.
Trassirovka β algoritmik fikrlashning eng asosiy ko'nikmasi. Uni va algoritmni boshqacha tasvirlash usullarini (blok-sxema, psevdokod) keyingi bobda batafsil ko'ramiz: 02 β Algoritmni tasvirlash.
"Yaxshi algoritm" qanaqa bo'ladi?¶
Algoritm shunchaki "ishlasa" β bu yetarli emas. Yaxshi algoritmni baholashda uchta asosiy mezon bor:
- To'g'rilik (correctness). Eng birinchi va shartsiz talab: algoritm barcha to'g'ri kirishlar uchun to'g'ri natija berishi kerak β nafaqat bitta misolda, balki chegaraviy holatlarda ham (bo'sh ro'yxat, bitta element, manfiy sonlar, takrorlanuvchi qiymatlar). Noto'g'ri, lekin tez algoritmdan ko'ra, sekin lekin to'g'risi afzal.
- Samaradorlik (efficiency). Algoritm qancha vaqt va qancha xotira ishlatadi? Ikkita to'g'ri algoritmdan kamroq resurs sarflaydigani yaxshiroq. Buni o'lchashni bu kitobning II qismida (07β11-boblar) o'rganamiz.
- Soddalik / o'qilishi (simplicity). Tushunarli, o'qilishi oson va boshqalar (yoki kelajakdagi o'zingiz) qo'llab-quvvatlay oladigan algoritm afzal. Eng murakkab, eng "aqlli" yechim har doim ham eng yaxshisi emas.
Trade-off: Ko'pincha bu uch mezon bir-biriga qarshi turadi. Eng tez algoritm ko'pincha eng murakkabi; eng sodda algoritm esa eng sekini bo'lishi mumkin. Yaxshi muhandis vaziyatga qarab muvozanat topadi. Bu trade-off'larni butun kitob davomida qayta-qayta uchratasiz, eng yorqin esa 33-bob (kapston)da.
Asosiy g'oyalar (bobni qisqacha)¶
- Algoritm β bu muammoni yechishning aniq, cheklangan qadamlar ketma-ketligi. U kompyuterga emas, g'oyaga tegishli; retsept ham, kod ham algoritm bo'lishi mumkin.
- So'z al-Xorazmiy ismidan kelib chiqqan (IX asr); "algebra" ham shu olimning asaridan.
- Haqiqiy algoritmning 5 xossasi: aniqlik (determinizm), cheklilik (to'xtaydi), kirish (0+), chiqish (1+), bajariluvchanlik (har amal real). Bittasi yetishmasa β to'liq algoritm emas.
- Algoritm β dastur β funksiya: algoritm β g'oya, dastur β uning biror tildagi kodi, funksiya β koddagi nomlangan blok.
- Bitta masalaga ko'p algoritm bor. "Qaysi yaxshiroq?" savoliga javob β to'g'rilik + samaradorlik + soddalik; samaradorlikni o'lchashni keyingi qismda o'rganamiz.
- Trassirovka β algoritmni qadamba-qadam qo'lda bajarish β uni tushunish va to'g'riligini tekshirishning eng kuchli usuli.
Mashqlar¶
Oson¶
1-mashq. Quyidagilardan qaysilari algoritm (5 xossani qanoatlantiradi), qaysilari emas? Sababini yozing. (a) "Eshikni och, ichkariga kir, eshikni yop." (b) "Yaxshi kayfiyat top va xursand bo'l." (c) "1 dan boshlab, ortib boruvchi barcha sonlarni to'xtamasdan chop et."
2-mashq. Quyidagi algoritm qaysi xossani buzadi? "Idishga suv sol, qaynaguncha qizdir, qaynamasa boshqatdan boshla." (Faraz qiling, suv hech qachon qaynamaydi.)
3-mashq. Mana bu ketma-ketlikni ko'ring va uning kirishi nima, chiqishi nima ekanini ayting:
"Ikki son a va b berilgan. Ularning ko'paytmasini hisoblab, natijani chiqar."
O'rta¶
4-mashq. "Tishni tozalash" jarayonini algoritm sifatida, kamida 5 ta aniq, raqamlangan qadamda yozing. Har qadam aniqlik xossasini qanoatlantirsin (noaniq so'zlardan qoching).
5-mashq. Quyidagi anti-misol algoritmni tuzating, toki u 5 xossani qanoatlantirsin: "Bir oz un ol, biroz suv qo'sh, kerakli paytgacha aralashtir, xamir tayyor bo'lsa to'xta."
6-mashq. eng_katta([4, 4, 4]) chaqirilganda yuqoridagi eng_katta funksiyasi nima qaytaradi? Trassirovka jadvalini tuzib, javobni ko'rsating.
Qiyin¶
7-mashq. "Ro'yxatdagi eng kichik sonni topish" masalasi uchun ikkita har xil algoritm tasvirlang (psevdokod yoki Python). Ikkalasi ham [5, 2, 8, 1, 9] da 1 berishini ko'rsating va qaysi biri kamroq ish bajarishini izohlang.
8-mashq. Quyidagi algoritm berilgan musbat butun n uchun to'xtaydimi? Mulohaza yuriting (cheklilikni isbotlash eskizi):
funksiya f(n):
takrorla (n > 1 bo'lganda):
agar n juft bo'lsa: n <- n / 2
aks holda: n <- n - 1
"tugadi" deb chiqar
Yechimlar
1-mashq yechimi¶
(a) Algoritm β aniq, cheklangan (3 qadam), bajariladigan amallar. To'g'ri. (b) Algoritm emas β "yaxshi kayfiyat top" bajariluvchanlik xossasini buzadi: "kayfiyat topish" aniq, real bajariladigan amal emas, va u o'lchanmagan (aniqlik ham yo'q). (c) Algoritm emas β cheklilik xossasini buzadi: "to'xtamasdan" degani hech qachon tugamaydi (cheksiz sikl).
2-mashq yechimi¶
Cheklilik xossasini buzadi. Agar suv hech qachon qaynamasa, "qaynamasa boshqatdan boshla" ko'rsatmasi cheksiz takrorlanadi β algoritm to'xtamaydi. To'xtash kafolati bo'lmasa, bu to'liq algoritm emas.
3-mashq yechimi¶
- Kirish: ikki son β
avab(2 ta kirish). - Chiqish: bitta son β ularning ko'paytmasi
a * b. Bu algoritm 5 xossani qanoatlantiradi (aniq, cheklangan, kirish bor, chiqish bor, bajariladi).
4-mashq yechimi¶
Mumkin bo'lgan javob (sizniki boshqacha, lekin aniq bo'lishi mumkin):
1. Tish cho'tkasiga 1 sm tish pastasi siq.
2. Cho'tkani suv bilan ho'lla.
3. Yuqori tishlarni 30 sekund tozala.
4. Pastki tishlarni 30 sekund tozala.
5. Og'izni suv bilan chayqa va tupur.
5-mashq yechimi¶
Noaniqliklarni aniq qiymatlar bilan almashtiramiz va to'xtash shartini aniqlaymiz:
1. 200 gramm un ol.
2. 100 ml suv qo'sh.
3. 5 daqiqa davomida aralashtir.
4. To'xta β xamir tayyor.
6-mashq yechimi¶
eng_katta([4, 4, 4]) β boshida eng = 4 (birinchi element), keyin qolgan 4, 4 ni tekshiramiz:
| Qadam | x |
x > eng ? |
eng |
|---|---|---|---|
| Boshlang'ich | β | β | 4 |
| 1 | 4 | 4 > 4 β yo'q | 4 |
| 2 | 4 | 4 > 4 β yo'q | 4 |
Natija: 4. Diqqat: shart x > eng (qat'iy katta) bo'lgani uchun teng qiymatlar engni o'zgartirmaydi, lekin bu javobga ta'sir qilmaydi β eng katta qiymat baribir 4.
7-mashq yechimi¶
1-algoritm β bir marta aylanib chiqish (kamroq ish):
def eng_kichik(sonlar):
eng = sonlar[0]
for x in sonlar[1:]:
if x < eng: # endi "kichikroq" ni qidiramiz
eng = x
return eng
print(eng_kichik([5, 2, 8, 1, 9])) # -> 1
def eng_kichik_2(sonlar):
return sorted(sonlar)[0] # o'sish bo'yicha saralab, birinchi element
print(eng_kichik_2([5, 2, 8, 1, 9])) # -> 1
1 beradi. 1-algoritm kamroq ish bajaradi: u ro'yxatni faqat bir marta aylanib chiqadi, 2-algoritm esa avval butun ro'yxatni saralaydi β bu eng kichikni topish uchun keraksiz qo'shimcha mehnat. (Ikkala namuna ham ishlatib tekshirildi.)
8-mashq yechimi¶
Ha, har qanday musbat butun n uchun to'xtaydi. Cheklilikni ko'rsatish g'oyasi β har takrorlanishda n qiymati kamayishi:
- Agar n juft bo'lsa, n <- n / 2 β n kamayadi (masalan, 8 β 4).
- Agar n toq bo'lsa, n <- n - 1 β n yana kamayadi (masalan, 7 β 6).
Har bir qadamda n qat'iy kamayadi va musbat butun son sifatida 1dan pastga tusha olmaydi (sikl n > 1 da to'xtaydi). Manfiy bo'lolmaydigan, har qadamda kamayadigan kattalik mavjudligi β siklning bir kun (n = 1 da) to'xtashini kafolatlaydi. Demak, bu algoritm cheklilik xossasini qanoatlantiradi.
Masalan, n = 6 uchun: 6 β 3 β 2 β 1 (to'xtaydi). n = 7 uchun: 7 β 6 β 3 β 2 β 1 (to'xtaydi).
Bu kabi "kamayuvchi kattalik" g'oyasi β siklning to'xtashini isbotlashning klassik usuli; uni 05-bobda chuqurroq ko'ramiz.
π README Β· Keyingi: 02 β Algoritmni tasvirlash: blok-sxema, psevdokod, trassirovka β‘οΈ