اولین بار است که به این وب‌سایت می‌آیید. راهنما را مطالعه کنید!
x
موسسه خیریه محک

شهر ریاضی بازی-ریاضی

استفاده از شمارش‌گر دلخواه در حلقه

+1 امتیاز
286 نمایش

من می‌خوام تو حلقه‌ی for به جای ++ یا عملیات ریاضی معمول از یه الگوریتم استفاده کنم که خیلی هم ساده نیست. بهترین راه برای پیاده کردن اون چیه/ الان فکر کردم که از while هم می‌شه استفاده کرد. اما اگه بشه از for استفاده کنم بدون اینکه کارایی برنامه پایین بیاد خوبه.

ویرایش (۱۴ خرداد): کد اصلی چیزی شبیه به اینه:

for(int i=0; i<100; i=f(i))
{
  ...
}
هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پرسیده شده جمعه ۹ فروردین ۱۳۹۲ در C++ توسط prodo  
ویرایش شده سه شنبه ۱۴ خرداد ۱۳۹۲ توسط prodo

یکم در مورده الگوریتمت توضیح بده.
برای مثال چه الگوریتمیه؟

مثلاً فرض کنیم می‌خوایم هر دفعه x = f(x) انجام بشه که این تابع f یه تابع تقریباً پیچیده و طولانیه.
در حقیقت، در حالت‌های عادی شمارش‌گر حلقه به صورت یه تصاعد حسابی یا هندسیه

2, 5, 8, ...
3, 9, 27, ...

اما فرض کنیم این یه دنباله‌ی دلخواه با فرمولی شبیه این باشه

int f(int x)
{
  int res;
  ...
  return res;
}

1 پاسخ

0 امتیاز

حلقه‌های for و while پس از کامپایل تفاوتی در زبان ماشین با هم نخواهند داشت. هر دو به پرش‌های زبان ماشین تبدیل می‌شن. بنابراین استفاده از while از نظر کارایی نباید تفاوتی با for داشته باشه.

فرض کنیم از while به صورت زیر استفاده می‌کنیم.

int i=0;
while(i<100)
{
  ...
  i = f(i);
}

حالا سوال اینه که f(i) بهتره چطوری پیاده بشه. دو حالت اصلی داریم.

الف) کدش مستقیماً در حلقه استفاده بشه یا تابع inline تعریف بشه. که در این صورت اگه کد یکی دو خطه بهتره که در خود حلقه باشه و اگه بیشتره به صورت inline تا خوانایی کد حفظ بشه.
ب) به صورت یک تابع معمولی که inline نیست. در این صورت برای هر بار فراخوانی یک پرش و برگشت انجام می‌شه که از نظر کارایی به‌صرفه نیست.

بنابراین بهتره از یکی از دو شکل حالت (الف) استفاده کنیم.

هیچ پژوهش انسانی نمی‌تواند ادعای علمی بودن داشته باشد، مگر این‌که از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)
پاسخ داده شده سه شنبه ۱۴ خرداد ۱۳۹۲ توسط prodo