Off by One at the Boundary
Chegarada bittaga xato
Uzunligi 100 metr bo'lgan yo'l bo'ylab, har 10 metrda bitta ustun (fence post) o'rnatmoqchisiz. Necha ustun kerak? "100 ni 10 ga bo'lib, 10 ta" deb javob bersangiz — XATO: agar boshida ham, oxirida ham ustun bo'lishi kerak bo'lsa, sizga 11 ta ustun kerak (0, 10, 20, ..., 100 nuqtalarida). Bu klassik "ustun-panjara xatosi" (fence post error) — chegaralarni hisoblashda BITTAGA adashish, dasturlashda ENG KO'P uchraydigan xatolardan biri.
Quyidagi kod review'ga yuborilgan: "Berilgan ro'yxatning DASTLABKI n ta elementining yig'indisini hisoblaydi."
func SumFirstN(nums []int, n int) int {
sum := 0
for i := 0; i <= n; i++ {
sum += nums[i]
}
return sum
}Bu kod, birinchi qarashda, mantiqan to'g'ri ko'rinadi: "0 dan n gacha yur, har birini qo'sh". Lekin diqqat bilan sanang: i <= n sharti bilan, sikl i = 0, 1, 2, ..., n qiymatlarini oladi — bu JAMI n+1 ta qiymat, n ta emas. Composite Types kursida ko'rgan slice indekslash qoidasiga ko'ra, n uzunlikdagi slice'ning ICHIDA indekslar faqat 0 dan n-1 gacha mavjud.
- •Agar
numsuzunligi ANIQnbo'lsa, sikli = nbo'lgandanums[n]ga murojaat qiladi — bu chegaradan CHIQIB ketish, dastur PANIC qiladi ("index out of range") - •Agar
numsuzunligindan KATTA bo'lsa, xato sezilmaydi (panic yo'q), lekin funksiya SO'RALGANDAN BIR TA KO'P element qo'shadi — natija NOTO'G'RI, lekin dastur ishdan chiqmaydi, shuning uchun bu xato ANCHA uzoq vaqt sezilmasdan qolishi mumkin - •To'g'ri kod:
for i := 0; i < n; i++— qat'iy kichik (<) belgisi, teng yoki kichik (<=) emas
Bu ikkinchi holat — panic QILMASDAN, shunchaki NOTO'G'RI natija berish — off-by-one xatolarining eng xavflisi, chunki u o'zini OSHKOR qilmaydi. Kod "ishlayotgandek" ko'rinadi, testlar ham (agar aynan chegaraviy holat bilan sinalmagan bo'lsa) o'tishi mumkin, lekin natija sekin-asta noto'g'ri hisoblanadi.
Review'da off-by-one xatolarini topishning kaliti — har bir <, <=, >, >= belgisini alohida, DIQQAT bilan o'qish, va "agar n=0 yoki n=len(nums) bo'lsa nima bo'ladi?" degan CHEGARAVIY holatlarni QO'LDA hisoblab ko'rish. "Ko'rinishidan to'g'ri" degan taassurotga ishonmasdan, chegara qiymatlarini aniq sanab chiqish — bu xato turini ushlaydigan yagona ishonchli yo'l.
Key Takeaway
Key Takeaway:
Har bir sikl yoki indeks chegarasini ko'rganda, < va <= orasidagi farqni diqqat bilan tekshiring va chegaraviy qiymatlarni (n=0, n=len) qo'lda hisoblab ko'ring. Off-by-one xatosi ko'pincha PANIC qilmaydi — u shunchaki natijani sekin-asta noto'g'ri qiladi.
NEXT UP
Giving Feedback That's Specific and Kind