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

پیش‌نیاز جست‌وجوی دودویی پایتون؛ بررسی ترتیب صعودی

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

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

مثلاً [1, 4, 4, 9] مرتب است، چون هیچ عضو از عضو قبلی کوچک‌تر نیست. تکرار چهار اشکالی ندارد؛ اینجا صعودی را به معنی «غیرکاهشی» می‌گیریم. اما [1, 7, 3] در آخرین همسایگی ترتیب را می‌شکند. برای تشخیص، فقط همسایه‌ها را بررسی کن؛ لازم نیست همه زوج‌ها را بسنجی.

توی تابع ناقص، با دیدن اولین افت مقدار False برگردون. اگر همه همسایه‌ها درست بودند، نتیجه True است. فهرست خالی و تک‌عضوی هم مرتب محسوب می‌شوند چون هیچ همسایگی خلاف ترتیب ندارند. خطای رایج استفاده از >= برای رد کردن است؛ آن شرط دو عضو برابر را هم اشتباه نامرتب اعلام می‌کند. این بررسی خودش خطی است و معمولاً یک بار قبل از مجموعه جست‌وجوها انجام می‌شود.

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

فعالیت شما

تابع is_sorted(nums) برای فهرست عددهای صحیح True برگرداند اگر nums[i-1] <= nums[i] در تمام همسایگی‌ها برقرار باشد، وگرنه False. خالی، تک‌عضوی و عددهای مساوی مرتب‌اند؛ [1,3,2] نامرتب است. ورودی را مرتب یا تغییر نده. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

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

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

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

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

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

def is_sorted(nums):
    for i in range(1, len(nums)):
        # TODO: reject a descending adjacent pair
        pass
    return True

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