Dasturiy ta'minotni ulash san'ati
O'ylaymanki, ko'pchiligimiz ba'zida jinsiy zo'ravonlik dasturlarini yoqish istagi bor. Bu erda biz bunday turlararo og'ishlar mamlakatimizda rag'batlantirilmasligini oldindan ogohlantirishga majburmiz. Katolik cherkovi vasiyat qilganidek, bizda hamma narsa bor: dasturga ega dastur, faqat turmush qurgandan keyin ... va sheriklar o'zgarmaydi, hatto o'sha dangasa yigit sizga barda mexnat sotib olgan bo'lsa ham. Garchi yo'q, yolg'on gapiryapman, haram tipidagi ko'pxotinlilik gullab-yashnamoqda. Ha, va shunga qaramay, quyida "ota" yoki "o'g'il" kabi so'zlardan foydalanishga qaramay, bizning dasturlarimiz germafroditlardir. Xo'sh, qarindosh-urug'lar ham... Uh, men ham jamoat haqida *facepalm* haqida gapirdim. OK, bu haqda keyinroq.
Dasturlarni kesib o'tish masalasi unchalik oddiy emas. Funktsiyalar, satrlar yoki o'zgaruvchilarning tasodifiy almashinuvi sizga yangi dastur emas, balki kompilyator / tarjimon tomonidan yuborilgan qo'rqinchli so'zlarning yog' oqimiga olib keladi. Ya'ni, dasturlarni kesib o'tish yo'lini topish kerak to'g'ri. Aqlli amakilar chiqish yo‘lini topdilar. Kompilyatorlarning tuzilishini o'rgangan aqlli o'g'il-qizlar ham allaqachon taxmin qilishgan. Ha, ha, bu sintaksis daraxti.
Men zudlik bilan ishtiyoqimni pasaytiraman: soqolimiz hali unchalik qalin emas, shuning uchun biz eng oddiy dasturlardan foydalanamiz. Xohlaganlar dasturlashning mislsiz boyligi vodiysiga borishlari mumkin, ammo biz uchun hamma narsa oddiy - dastur ifodalardan iborat bo'lib, ular o'z navbatida ba'zi arit, o'zgaruvchilar va konstantalarga ega oddiy funktsiyalardan iborat. Har bir ifoda dastur tomonidan qaytarilgan qiymatlardan birini hisoblaydi.
Masalan: kvadrat tenglamani yechishga urinayotgan (juda muvaffaqiyatli emas) ikkita ifodadan iborat individual dastur kvadrati:
funktsiya kvadrati(a, b, c)( x1 = min(sin(b)*(a+1), 0); x2 = 3 + exp(log(b*a)); qaytish (x1, x2); )
Biz taqdimotga qaror qildik, endi saqlash bilan shug'ullanishimiz kerak. Aynan shu dasturlar atrofida hali ham ko'plab raqslar mavjud bo'lgani uchun, shu jumladan ularni tizimning bir qismidan ikkinchisiga o'tkazish (umuman olganda, bu mening holatimda, odatda, turli tillarda yozilgan), bizning shaxsimizni daraxt shaklida saqlash. unchalik qulay emas. Uni qulayroq ko'rsatish uchun (ideal holda, ba'zi chekli alifbolar ustidagi satrlar to'plami) bizning individual-daraxtlar to'plami kodlash / dekodlashni o'rganishi kerak.
Shunday qilib, biz daraxtni satr sifatida ko'rsatishimiz kerak. Bu erda bizga karva daraxtlarining kuchi yordam beradi. Boshlash uchun daraxtda topilishi mumkin bo'lgan funktsiyalar, o'zgaruvchilar va konstantalar to'plami haqida qaror qabul qilish kerak. O'zgaruvchilar va konstantalar daraxt barglariga mos keladi va terminallar deb ataladi, funktsiyalar - daraxtning qolgan (ichki) tugunlariga terminal bo'lmaganlar deyiladi. Funktsiyalar turli xil argumentlarga ega bo'lishi mumkinligiga ham e'tibor qaratish lozim, shuning uchun bizga bunday bilim kerak bo'ladi ("arnost", - bu so'z mutaxassislar og'zidan jimgina yugurdi). Natijada kodlash jadvali, masalan, bu:
Bu yerda n, +, *, agar funksiyalar; 2 - doimiy; a va b o'zgaruvchilardir. Haqiqiy masalalarda jadval og'irroq, bunday to'plam bilan va kvadrat tenglamani yechish mumkin emas. Shuni ham yodda tutish kerakki, nolga bo'linmaslik va apokalipsisning boshqa stsenariylariga yo'l qo'ymaslik uchun barcha funktsiyalar haqiqiy raqamlarning butun to'plamida aniqlanishi kerak (yaxshi yoki vazifada qanday to'plamdan foydalansangiz). Aks holda, siz qorovulda o'tirishingiz, noldan logarifmlarni ushlashingiz va keyin u bilan nima qilishni aniqlab olishingiz kerak bo'ladi. Biz mag'rur odamlar emasmiz, bunday variantlarni hisobga olmaganda, biz oson yo'ldan boramiz.
Как я сохранила себе память и остановила старение мозга...
Shunday qilib, bunday jadval yordamida funktsiyalarni daraxtdan chiziqqa va orqaga quvish muammo emas. Masalan, biz shifrni ochish uchun quyidagi qatorni oldik:
Biz har bir elementni jadvalga muvofiq aniqlaymiz, shuningdek, arity haqida eslaymiz:
Endi, arity-dan foydalanib, biz funktsiya argumentlariga havolalar joylashtiramiz:
E'tibor bering, ro'yxatning oxirgi 3 ta elementi hech kimga foydasiz bo'lib chiqdi va ularning qiymatlari hech qanday tarzda funktsiya natijasiga ta'sir qilmaydi. Bu ro'yxat elementlarining soni, daraxt tugunlari soni doimiy ravishda ularning aritylariga qarab suzuvchi bo'lganligi sababli sodir bo'ldi. Shunday qilib, keyinchalik noto'g'ri daraxt bilan azoblanishdan ko'ra, zahiralarni yig'ish yaxshiroqdir.
Endi, agar biz uni birinchi element bilan tortib olsak, qo'limizda osilgan ifoda daraxti bo'ladi:
Зрение восстановится за день на 105%! Легкая домашняя хитрость от гениального студента..
Funktsiyaning qiymati daraxtning rekursiv o'tishi bilan hisoblanishi mumkin, bizda shunday bo'ladi:
Mening ko'zlarim dadamdan qolgan
Biz eng issiq joyga - o'tish joyiga qaytamiz. Dasturni kesib o'tish operatsiyalari uchun quyidagi shartlarni qo'yamiz: birinchidan, ikkita kesishuvchi individlar ikkita nasl beradi (ya'ni populyatsiya soni doimiy); ikkinchidan, kesib o'tish natijasida avlodlar, ma'lum darajada, ikkala ota-onaning xususiyatlariga ega bo'lishi kerak (ya'ni, olma olma daraxtidan juda uzoqqa aylanmasligi kerak). Endi biz dastur qanday taqdim etilishini bilib oldik - bu satrlar yoki daraxtlar to'plamimi. Shunga ko'ra, ularni iplar yoki daraxtlar sifatida kesib o'tish mumkin.
Daraxtlarni kesib o'tish - tasodifiy tanlangan novdalar almashinuvi. String kesishish bir necha usullar bilan amalga oshirilishi mumkin: bir nuqtali rekombinatsiya (bo'lak-bo'lak yopishtirish), ikki nuqtali rekombinatsiya, elementlarni elementlar almashinuvi va boshqalar. Ularni qo'shimchali iboralar bilan uzun murakkab jumlalar bilan tasvirlash mumkin, lekin diagrammaga bir qarash. nima ekanligini tushunish uchun etarli:
Shuni ta'kidlash kerakki, rekombinatsiyada yopishtirish joylari tasodifiy tanlanadi, xuddi elementlarni elementlarning kesishishida bo'lgani kabi, almashinuv ma'lum bir ehtimollik bilan amalga oshiriladi. Daraxtlarni irsiyat nuqtai nazaridan kesib o'tish yanada istiqbolli ko'rinadi, ammo uni amalga oshirish qiyinroq.
Dostları ilə paylaş: |