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

رفع باگ بازه از صفر در جمع پیشوندی پایتون

جمع پیشوندی در پایتون؛ پرس‌وجوی بازه بدون دوباره‌کاری · 0٪

✍️ بعضی فرمول‌ها فقط روی بازه‌های وسط فهرست ظاهراً درست به نظر می‌رسند. آزمون بازه‌ای که از صفر شروع می‌شود، تعریف جدول را بهتر محک می‌زند. در تعریف ما prefix[left] سهم اعضای قبل از بازه است؛ وقتی left صفر باشد، آن سهم واقعاً صفر است و در خانه صفر آماده داریم.

برای مثال، در جدول [0,5,7,11] که از [5,2,4] ساخته شده، جمع خانه‌های صفر تا یک برابر prefix[2]-prefix[0] یعنی هفت است. اگر به جای آن prefix[left-1] بنویسی، پایتون از شاخص منفی یک استفاده می‌کند و آخرین جمع را کم می‌کند. برنامه ممکن است بدون خطای اجرا، جواب کاملاً نادرست بدهد.

تابع این تمرین خود جدول آماده را می‌گیرد؛ دوباره آن را نساز. تمام بازه‌های داده‌شده معتبر و بسته‌اند، پس لازم نیست رفتار بازه معکوس یا بیرون محدوده تعریف کنی. خطای رایج، اضافه کردن یک شرط ویژه فقط برای left صفر است، در حالی که فرمول عمومی درست همه حالت‌ها را پوشش می‌دهد. اول تعریف «جمع اولین i عضو» را کنار فرمول بنویس، بعد شاخص اشتباه را اصلاح کن.

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

فعالیت شما

تابع range_from_prefix(prefix,left,right) یک جدول معتبر با صفر ابتدایی از ورودی عدد صحیح و دو شاخص معتبر 0<=left<=right<n می‌گیرد؛ جمع بازه بسته را عددی برگرداند. n=len(prefix)-1؛ ورودی خالی برای این تابع بازه ندارد و ارسال نمی‌شود. بازه تک‌عضوی و left=0 معتبرند؛ range_from_prefix([0,5,7,11],0,1)=7. ورودی تغییر نکند. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

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

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

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

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

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

def range_from_prefix(prefix, left, right):
    return prefix[right + 1] - prefix[left - 1]

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