✍️ حالا جستوجوی دودویی را برای ورودی دارای تکرار میسازیم. اگر قرارداد «هر رخداد» بود، پیدا کردن مقدار وسط کافی بود؛ اما برای اولین رخداد باید پس از یافتن برابری، جستوجو را در سمت چپ ادامه بدهیم. جواب پیداشده را نگه میداریم تا اگر چیزی زودتر نبود، همان را برگردونیم.
مثلاً در [1, 4, 4, 4, 9] خانه وسط چهار است، اما شاخص دو پاسخ نهایی نیست. آن را نامزد میکنیم، مرز راست را به خانه قبل از وسط میبریم و در نهایت به شاخص یک میرسیم. این روش همچنان در هر دور محدوده را کوچک میکند؛ لازم نیست بعد از یافتن هدف خطی به عقب قدم بزنی.
تابع را با یک جواب اولیه -1 بنویس. روی برابری، جواب را بهروز کن و فقط سمت چپ را نگه دار. روی کوچکتر بودن وسط، سمت راست را دنبال کن. خطای رایج، بازگشت فوری روی اولین برابری یا مرتب کردن ورودی داخل تابع است؛ اولی اولین رخداد را تضمین نمیکند و دومی شماره خانههای قرارداد را تغییر میدهد. مرتب بودن ورودی از پیش تضمین شده است.
تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.
فعالیت شما
تابع first_binary(nums,target) فهرست صعودی غیرکاهشی از اعداد صحیح و هدف صحیح میگیرد؛ اولین شاخص صفرمبنای هدف را برگرداند یا در نبودش -1. خالی -1؛ همهبرابر و تکعضوی باید درست باشند. first_binary([1,4,4,9],4)=1. ورودی را تغییر نده و محدوده را به روش دودویی کم کن. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.