حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش الگوریتم و حل مسئله با پایتون؛ تمرین عملی

پیاده‌سازی جست‌وجوی دودویی اولین رخداد در پایتون

جست‌وجوی خطی و دودویی در پایتون؛ قرارداد و مرزها · 0٪

✍️ حالا جست‌وجوی دودویی را برای ورودی دارای تکرار می‌سازیم. اگر قرارداد «هر رخداد» بود، پیدا کردن مقدار وسط کافی بود؛ اما برای اولین رخداد باید پس از یافتن برابری، جست‌وجو را در سمت چپ ادامه بدهیم. جواب پیدا‌شده را نگه می‌داریم تا اگر چیزی زودتر نبود، همان را برگردونیم.

مثلاً در [1, 4, 4, 4, 9] خانه وسط چهار است، اما شاخص دو پاسخ نهایی نیست. آن را نامزد می‌کنیم، مرز راست را به خانه قبل از وسط می‌بریم و در نهایت به شاخص یک می‌رسیم. این روش همچنان در هر دور محدوده را کوچک می‌کند؛ لازم نیست بعد از یافتن هدف خطی به عقب قدم بزنی.

تابع را با یک جواب اولیه -1 بنویس. روی برابری، جواب را به‌روز کن و فقط سمت چپ را نگه دار. روی کوچک‌تر بودن وسط، سمت راست را دنبال کن. خطای رایج، بازگشت فوری روی اولین برابری یا مرتب کردن ورودی داخل تابع است؛ اولی اولین رخداد را تضمین نمی‌کند و دومی شماره خانه‌های قرارداد را تغییر می‌دهد. مرتب بودن ورودی از پیش تضمین شده است.

تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

فعالیت شما

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

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

def first_binary(nums, target):
    # TODO: retain the earliest match while narrowing the range
    pass

# این تابع آماده فقط برای ارزیابی است؛ آن را تغییر نده.
def course_check(*args):
    from copy import deepcopy
    before = deepcopy(args)
    result = first_binary(*args)
    if args != before:
        raise ValueError('ورودی نباید تغییر کند.')
    return result