مثال بازنویسی کد

این مثال نشان می‌دهد که چگونه با استفاده از DeepSeek می‌توان کد را تحلیل و بهینه‌سازی کرد، شامل مدیریت خطا، توضیحات و بهبود عملکرد.

وظیفه

کد زیر را که ناکارآمد است و موارد حدی را مدیریت نمی‌کند، تحلیل و بهینه‌سازی کنید:

def fib(n): if n <= 2: return n return fib(n-1) + fib(n-2)

پرامپت

کد بالا ناکارآمد است و موارد حدی را مدیریت نمی‌کند. لطفاً مشکلات و راه‌حل‌ها را توضیح دهید و کد را بهینه‌سازی کنید.

پاسخ

تحلیل مشکل

این پیاده‌سازی تابع فیبوناچی fib(n) از بازگشت استفاده می‌کند. کد ساده است اما مشکلات زیر را دارد:

  1. محاسبات تکراری: فراخوانی‌های بازگشتی منجر به محاسبات مکرر می‌شود. به عنوان مثال، هنگام محاسبه fib(5)، مقادیر fib(3) و fib(2) چندین بار محاسبه می‌شوند که کارایی را کاهش می‌دهد.

  2. مدیریت ناکافی موارد حدی: در حالی که مورد n <= 2 مدیریت می‌شود، مورد n < 0 در نظر گرفته نمی‌شود. تابع برای ورودی‌های منفی نتایج نادرست برمی‌گرداند.

  3. محدودیت عمق بازگشت: برای مقادیر بزرگ n، عمق بازگشت می‌تواند از محدودیت استاندارد پایتون فراتر رفته و باعث RecursionError شود.

راه‌حل‌ها

  1. استفاده از حافظه‌سازی: ذخیره اعداد فیبوناچی محاسبه شده در حافظه نهان برای جلوگیری از محاسبات تکراری و بهبود کارایی.

  2. مدیریت موارد حدی: افزودن بررسی برای n < 0 و برگرداندن پیام خطا یا مقدار پیش‌فرض مناسب.

  3. تکرار به جای بازگشت: بازگشت اگرچه زیباست اما برای مجموعه داده‌های بزرگ ناکارآمد است. استفاده از حلقه برای محاسبه اعداد فیبوناچی و اجتناب از محدودیت عمق بازگشت.

کد بهینه‌سازی شده

روش 1: بازگشت با حافظه‌سازی

def fib(n, memo={}): if n < 0: raise ValueError("ورودی باید یک عدد صحیح غیر منفی باشد") if n <= 2: return 1 if n in memo: return memo[n] memo[n] = fib(n-1, memo) + fib(n-2, memo) return memo[n]

روش 2: تکرار

def fib(n): if n < 0: raise ValueError("ورودی باید یک عدد صحیح غیر منفی باشد") if n <= 2: return 1 a, b = 1, 1 for _ in range(3, n+1): a, b = b, a + b return b

توضیح

  1. بازگشت با حافظه‌سازی:

    • از دیکشنری memo برای ذخیره اعداد فیبوناچی محاسبه شده استفاده می‌کند
    • قبل از هر فراخوانی بازگشتی، memo را بررسی می‌کند و در صورت وجود نتیجه، مستقیماً آن را برمی‌گرداند
    • برای ورودی‌های منفی ValueError پرتاب می‌کند
  2. تکرار:

    • از متغیرهای a و b برای ذخیره دو عدد فیبوناچی آخر استفاده می‌کند
    • اعداد فیبوناچی را در یک حلقه از 3 تا n محاسبه می‌کند
    • همچنین برای ورودی‌های منفی ValueError پرتاب می‌کند

خلاصه

کد بهینه‌سازی شده کارایی را بهبود می‌بخشد و موارد حدی را به درستی مدیریت می‌کند. هر دو روش حافظه‌سازی و تکرار تکنیک‌های بهینه‌سازی مؤثری هستند و انتخاب بین آنها به نیازمندی‌ها و سناریوهای خاص بستگی دارد.

کد تولید پاسخ

from openai import OpenAI client = OpenAI( base_url="https://api.deepseek.com/", api_key="<YOUR_API_KEY>" ) completion = client.chat.completions.create( model="deepseek-chat", messages=[ { "role": "user", "content": "کد بالا ناکارآمد است و موارد حدی را مدیریت نمی‌کند. لطفاً مشکلات و راه‌حل‌ها را توضیح دهید و کد را بهینه‌سازی کنید." } ] ) print(completion.choices[0].message.content)