✍️ در این نسخه جستوجوی دودویی، هر دو مرز جزو محدودهاند: از left تا right، با احتساب هر دو خانه. وقتی مرزها برابر شوند هنوز یک نامزد داریم. بنابراین شرط ادامه باید آن حالت را هم بپذیرد. شرط اشتباه left < right گاهی همه مسیر را درست میرود، ولی آخرین خانه باقیمانده را بدون بررسی رها میکند.
برای مثال، در [2, 5, 11] دنبال یازده بگرد. اول خانه وسط با مقدار پنج دیده میشود، بعد مرز چپ به دو میرسد. حالا هر دو مرز دو هستند و هنوز باید همان خانه آخر را بررسی کنیم. برای یک فهرست تکعضوی این مشکل حتی از اولین لحظه دیده میشود.
کد اولیه را اصلاح کن و بازگشت شکست را بیرون حلقه نگه دار. با کوچک بودن مقدار وسط، left باید mid + 1 شود؛ با بزرگ بودن آن، right باید mid - 1 شود تا محدوده واقعاً کوچک شود. خطای رایج ترکیب مرز بسته با شرط مربوط به یک قرارداد دیگر است. این تمرین فقط فهرست صعودی با عددهای متمایز دارد؛ هنوز لازم نیست اولین رخداد تکراری را پیدا کنی.
تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.
فعالیت شما
تابع binary_find(nums,target) روی فهرست صعودیِ عددهای صحیح متمایز، شاخص target یا -1 را برگرداند. مرزها شامل هر دو سر هستند؛ خالی -1، تکعضوی مطابق حضور هدف و هدف در آخرین خانه باید درست باشد. مثلاً binary_find([2,5,11],11)=2. ورودی تغییر نکند. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.