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

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

دیکشنری پایتون برای حل مسئله؛ فراوانی و مجموع دو عدد · 0٪

✍️ مسئله مجموع دو عدد می‌پرسد آیا دو خانه متفاوت وجود دارند که جمع مقدارشان هدف شود. متفاوت بودن خانه‌ها مهم‌تر از متفاوت بودن مقدارهاست. دو عدد پنج در دو خانه می‌توانند ده بسازند، اما یک پنج تنها نمی‌تواند دوبار مصرف شود. برای شروع، یک راه‌حل ساده با دو حلقه می‌سازیم تا همین قرارداد روشن بماند.

مثلاً در [2, 6, 9] هدف هشت با خانه‌های صفر و یک ساخته می‌شود. هدف دوازده پیدا نمی‌شود؛ هرچند شش به‌اضافه خودش دوازده است، فقط یک خانه با مقدار شش داریم. کد اولیه حلقه داخلی را از خود i آغاز کرده و به همین دلیل زوج خودی را هم می‌پذیرد.

محدوده حلقه دوم را اصلاح کن تا همیشه j > i باشد. در این فعالیت فقط وجود یا نبود زوج مهم است و خروجی باید بولی باشد، نه خود عددها یا شاخص‌ها. خطای رایج، رد کردن مقدارهای برابر به‌جای شاخص‌های برابر است؛ آن اصلاح اشتباه، زوج معتبر [5,5] را هم حذف می‌کند. این نسخه پایه درجه دوم است و در گام بعد به کمک دیکشنری آن را سریع‌تر می‌کنیم.

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

فعالیت شما

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

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

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

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

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

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

def has_pair(nums, target):
    for i in range(len(nums)):
        for j in range(i, len(nums)):
            if nums[i] + nums[j] == target:
                return True
    return False

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