بکندباز

۱۰ تمرین ساده برای تقویت مهارت‌های پایتون (با پاسخ تشریحی)

تمرین و حل مسئله یکی از بهترین روش‌ها برای یادگیری و تقویت مهارت‌های برنامه‌نویسی است. در این مقاله، ۱۰ تمرین ساده اما مفید برای یادگیری پایتون ارائه می‌کنیم. هر تمرین شامل توضیح مسئله، راهنمایی کوتاه، و یک پاسخ تشریحی است. این تمرین‌ها برای برنامه‌نویسان مبتدی تا متوسط مناسب هستند. بیایید مستقیماً سراغ تمرین اول برویم.

تمرین ۱: شمارش تکرار حروف یک رشته

توضیح مسئله

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

مثال ورودی و خروجی

ورودی:

text = "python programming"

خروجی مورد انتظار:

{'p': 2, 'y': 1, 't': 1, 'h': 1, 'o': 2, 'n': 2, ' ': 1, 'r': 2, 'g': 2, 'a': 1, 'm': 2, 'i': 1}

 

راهنمایی

  • می‌توانید از یک dict برای نگهداری تعداد تکرار هر کاراکتر استفاده کنید.
  • از collections.Counter هم می‌توان استفاده کرد که راه ساده‌تری است.

پاسخ تشریحی

روش ۱: استفاده از حلقه for

def count_characters(text):

char_count = {} # یک دیکشنری خالی برای شمارش حروف

for char in text:

if char in char_count:

char_count[char] += 1

else:

char_count[char] = 1

return char_count

 

text = "python programming"

print(count_characters(text))

توضیح کد:

  1. یک دیکشنری خالی به نام char_count ایجاد می‌کنیم.
  2. با یک حلقه for، روی تمام کاراکترهای متن ورودی پیمایش می‌کنیم.
  3. اگر کاراکتر در دیکشنری وجود داشت، مقدار آن را یک واحد افزایش می‌دهیم. در غیر این صورت، مقدار اولیه‌ی آن را ۱ قرار می‌دهیم.
  4. در نهایت، دیکشنری نهایی که شامل شمارش هر کاراکتر است، برگردانده می‌شود.

 

روش ۲: استفاده از collections.Counter

from collections import Counter

 

text = "python programming"

char_count = Counter(text)

print(char_count)

چرا این روش بهتر است؟

  • این روش فقط در دو خط کد انجام می‌شود.
  • Counter به‌صورت داخلی همین عملیات شمارش را بهینه انجام می‌دهد.

تمرین ۲: پیدا کردن عدد گمشده در لیست

توضیح مسئله

یک لیست از اعداد متوالی از ۱ تا n داریم که یکی از اعداد آن به‌طور تصادفی حذف شده است. برنامه‌ای بنویسید که عدد گمشده را پیدا کند.

مثال ورودی و خروجی

ورودی:

numbers = [1, 2, 3, 4, 6, 7, 8, 9, 10]

خروجی مورد انتظار:

5

 

راهنمایی

  • مجموع دنباله حسابی از ۱ تا n را می‌توان با فرمول n * (n + 1) // 2 محاسبه کرد.
  • مجموع مقادیر موجود در لیست را از این مقدار کم کنید تا عدد گمشده را پیدا کنید.
  • همچنین می‌توان از عملیات set استفاده کرد.

 

پاسخ تشریحی

 

روش ۱: استفاده از مجموع دنباله حسابی

def find_missing_number(numbers):

n = len(numbers) + 1 # تعداد کل اعداد باید یک واحد بیشتر از طول لیست باشد

expected_sum = n * (n + 1) // 2 # محاسبه مجموع دنباله ۱ تا n

actual_sum = sum(numbers) # محاسبه مجموع اعداد موجود در لیست

return expected_sum - actual_sum # اختلاف برابر با عدد گمشده است

 

numbers = [1, 2, 3, 4, 6, 7, 8, 9, 10]

print(find_missing_number(numbers)) # خروجی: 5

 

توضیح کد:

  1. تعداد کل اعداد (n) را برابر با طول لیست به‌علاوه‌ی ۱ در نظر می‌گیریم.
  2. مجموع مورد انتظار دنباله‌ی ۱ تا n را با استفاده از فرمول دنباله حسابی محاسبه می‌کنیم.
  3. مجموع مقادیر واقعی در لیست را محاسبه کرده و از مجموع مورد انتظار کم می‌کنیم.
  4. مقدار باقی‌مانده همان عدد گمشده است.

 

روش ۲: استفاده از set

def find_missing_number_set(numbers):

n = len(numbers) + 1

full_set = set(range(1, n + 1)) # ایجاد مجموعه کامل اعداد از ۱ تا n

numbers_set = set(numbers) # تبدیل لیست ورودی به مجموعه

missing_number = full_set - numbers_set # پیدا کردن تفاوت بین دو مجموعه

return missing_number.pop() # استخراج مقدار باقی‌مانده

 

numbers = [1, 2, 3, 4, 6, 7, 8, 9, 10]

print(find_missing_number_set(numbers)) # خروجی: 5

 

چرا این روش جالب است؟

  • از مزیت‌های set استفاده می‌کند که جستجو در آن سریع است.
  • نیازی به انجام محاسبات ریاضی ندارد.
  • کد خواناتر است.

تمرین ۳: تشخیص عدد اول

توضیح مسئله

برنامه‌ای بنویسید که یک عدد را دریافت کند و تشخیص دهد که آیا عدد اول است یا خیر.

 

تعریف عدد اول

عدد اول، عددی بزرگ‌تر از ۱ است که فقط دو مقسوم‌علیه دارد: ۱ و خودش.

 

مثال ورودی و خروجی

ورودی:

n = 29

خروجی مورد انتظار:

True # 29 یک عدد اول است

ورودی:

n = 15

خروجی:

False # 15 عدد اول نیست چون بر 3 و 5 بخش‌پذیر است

 

راهنمایی

  • عددی که بر عددی کوچکتر از خودش (غیر از ۱) بخش‌پذیر باشد، اول نیست.
  • نیازی به بررسی مقسوم‌علیه‌های بزرگ‌تر از رادیکال آن عدد نیست، زیرا اگر عددی مقسوم‌علیه بزرگ‌تر داشته باشد، یک مقسوم‌علیه کوچک‌تر از رادیکال هم خواهد داشت.
  • بررسی بخش‌پذیری تا √n زمان اجرای بهتری نسبت به بررسی همه اعداد دارد.

 

پاسخ تشریحی

 

روش ۱: بررسی تمامی مقسوم‌علیه‌ها تا n

def is_prime(n):

if n < 2:

return False # اعداد کمتر از 2 اول نیستند

for i in range(2, n):

if n % i == 0:

return False # اگر بر عددی بخش‌پذیر باشد، اول نیست

return True

 

print(is_prime(29)) # خروجی: True

print(is_prime(15)) # خروجی: False

مشکل این روش:

  • زمان اجرای آن O(n) است، زیرا برای هر مقدار n باید تا n-1 بررسی انجام شود.
  • برای اعداد بزرگ، کند خواهد شد.
آموزش مرتبط:  اهمیت حل تمرین در طول یادگیری یک زبان برنامه نویسی

روش ۲: بهینه‌سازی با بررسی تا √n

import math

 

def is_prime_optimized(n):

if n < 2:

return False

if n in (2, 3):

return True # 2 و 3 جزو اعداد اول هستند

if n % 2 == 0 or n % 3 == 0:

return False # اعداد زوج (غیر از 2) و مضارب 3 اول نیستند

for i in range(5, int(math.sqrt(n)) + 1, 2): # بررسی از ۵ تا √n با گام ۲ (فقط اعداد فرد)

if n % i == 0:

return False

return True

 

print(is_prime_optimized(29)) # خروجی: True

print(is_prime_optimized(15)) # خروجی: False

 

چرا این روش بهتر است؟

  • به جای بررسی تمام اعداد تا n، فقط تا √n را بررسی می‌کنیم.
  • به جای بررسی تمام اعداد، فقط اعداد فرد و غیرقابل تقسیم بر ۲ و ۳ را چک می‌کنیم.
  • اجرای سریع‌تری نسبت به روش اول دارد، مخصوصاً برای اعداد بزرگ.

 

تمرین ۴: برعکس کردن رشته (بدون استفاده از توابع آماده)

توضیح مسئله

برنامه‌ای بنویسید که یک رشته ورودی را دریافت کرده و آن را بدون استفاده از توابع آماده (مثل [::-1] یا reversed()) برعکس کند.

مثال ورودی و خروجی

ورودی:

text = "Python"

خروجی مورد انتظار:

"nohtyP"

 

راهنمایی

  • از یک حلقه for برای پیمایش از انتهای رشته به ابتدا استفاده کنید.
  • از لیست و متد join() برای ساختن رشته برعکس استفاده کنید.
  • روش دیگر، استفاده از دو اشاره‌گر (Two Pointers) است که از دو سمت رشته حرکت می‌کنند و کاراکترها را جابه‌جا می‌کنند.

پاسخ تشریحی

 

روش ۱: استفاده از حلقه for

def reverse_string(text):

reversed_text = ""

for char in text:

reversed_text = char + reversed_text # کاراکتر جدید را در ابتدای رشته قرار می‌دهیم

return reversed_text

 

print(reverse_string("Python")) # خروجی: "nohtyP"

توضیح کد:

  1. متغیر reversed_text را به‌صورت یک رشته خالی تعریف می‌کنیم.
  2. با پیمایش روی text، هر کاراکتر جدید را در ابتدای reversed_text اضافه می‌کنیم.
  3. در نهایت، رشته معکوس شده را برمی‌گردانیم.

مشکل این روش:

  • این روش کار می‌کند اما از نظر کارایی بهینه نیست، زیرا هر بار یک رشته جدید ساخته می‌شود (عملیات اضافه کردن به ابتدای رشته کند است).

روش ۲: استفاده از لیست و join()

def reverse_string_list(text):

reversed_chars = [] # لیست خالی برای نگهداری کاراکترها

for char in text:

reversed_chars.insert(0, char) # درج کاراکتر در ابتدای لیست

return "".join(reversed_chars) # تبدیل لیست به رشته

 

print(reverse_string_list("Python")) # خروجی: "nohtyP"

چرا این روش بهتر است؟

  • لیست‌ها تغییرپذیر هستند و عملیات insert(0, char) سریع‌تر از الحاق مستقیم به ابتدای رشته است.
  • در نهایت با join() تمام عناصر را به رشته تبدیل می‌کنیم.

 

روش ۳: استفاده از دو اشاره‌گر (بهینه‌ترین روش)

def reverse_string_pointers(text):

text_list = list(text) # تبدیل رشته به لیست (زیرا رشته‌ها تغییرناپذیرند)

left, right = 0, len(text_list) - 1

 

while left < right:

text_list[left], text_list[right] = text_list[right], text_list[left] # جابجایی کاراکترها

left += 1

right -= 1

 

return "".join(text_list) # تبدیل لیست به رشته

 

print(reverse_string_pointers("Python")) # خروجی: "nohtyP"

چرا این روش بهتر است؟

  • از دو اشاره‌گر برای جابه‌جایی مقدارها استفاده می‌کند.
  • پیچیدگی زمانی O(n/2) دارد که سریع‌تر از روش‌های قبلی است.
  • این روش دقیقاً همان‌کاری را انجام می‌دهد که در توابع داخلی [::-1] یا reversed() انجام می‌شود.

تمرین ۵: حذف عناصر تکراری از یک لیست (حفظ ترتیب اولیه)

توضیح مسئله

برنامه‌ای بنویسید که یک لیست از اعداد یا رشته‌ها را دریافت کند و عناصر تکراری را حذف کند، اما ترتیب اولیه لیست را حفظ کند.

مثال ورودی و خروجی

ورودی:

numbers = [1, 2, 3, 2, 4, 1, 5, 6, 3, 7]

خروجی مورد انتظار:

[1, 2, 3, 4, 5, 6, 7]

 

راهنمایی

  • از set برای حذف تکراری‌ها استفاده کنید، اما چون set ترتیب را حفظ نمی‌کند، نمی‌توان آن را مستقیماً به کار برد.
  • از یک لیست کمکی برای نگه‌داشتن عناصر یکتا استفاده کنید.
  • روش دیگر، استفاده از OrderedDict در collections است که می‌تواند هم ترتیب را حفظ کند و هم عناصر تکراری را حذف کند.

پاسخ تشریحی

روش ۱: استفاده از لیست و set

def remove_duplicates(lst):

unique_list = []

seen = set()

 

for item in lst:

if item not in seen:

unique_list.append(item) # اگر قبلاً دیده نشده، اضافه شود

seen.add(item) # اضافه کردن به مجموعه‌ی دیده‌شده‌ها

 

return unique_list

 

numbers = [1, 2, 3, 2, 4, 1, 5, 6, 3, 7]

print(remove_duplicates(numbers)) # خروجی: [1, 2, 3, 4, 5, 6, 7]

 

توضیح کد:

  1. یک لیست unique_list برای ذخیره مقادیر یکتا و یک set برای ذخیره موارد دیده‌شده ایجاد می‌کنیم.
  2. در حلقه for، بررسی می‌کنیم که آیا عنصر قبلاً در seen وجود دارد یا نه.
  3. اگر وجود ندارد، آن را به لیست unique_list اضافه کرده و در set ثبت می‌کنیم.

 

چرا این روش خوب است؟

ترتیب عناصر را حفظ می‌کند.

پیچیدگی زمانی O(n) دارد، چون هر عنصر فقط یک بار پردازش می‌شود.

روش ۲: استفاده از OrderedDict

from collections import OrderedDict

 

def remove_duplicates_ordered(lst):

return list(OrderedDict.fromkeys(lst)) # از OrderedDict برای حذف تکراری‌ها و حفظ ترتیب استفاده می‌کنیم

 

numbers = [1, 2, 3, 2, 4, 1, 5, 6, 3, 7]

print(remove_duplicates_ordered(numbers)) # خروجی: [1, 2, 3, 4, 5, 6, 7]

 

چرا این روش جالب است؟

  • OrderedDict.fromkeys(lst) به‌طور خودکار کلیدها (عناصر لیست) را در ترتیب اصلی حفظ می‌کند و تکراری‌ها را حذف می‌کند.
  • بسیار کوتاه و خوانا است!
  • زمان اجرای مشابه روش قبلی (O(n)) دارد.
آموزش مرتبط:  اهمیت حل تمرین در طول یادگیری یک زبان برنامه نویسی

تمرین ۶: مجموع اعداد موجود در یک رشته

توضیح مسئله

برنامه‌ای بنویسید که یک رشته‌ی شامل حروف و اعداد را دریافت کرده و مجموع تمام اعداد داخل آن را محاسبه کند.

مثال ورودی و خروجی

ورودی:

text = "abc123xyz45lmn7"

خروجی مورد انتظار:

175 # مجموع 123 + 45 + 7

 

راهنمایی

  • می‌توان از یک حلقه برای پیمایش روی رشته استفاده کرد و اعداد را استخراج کرد.
  • از ماژول re (Regular Expressions) نیز می‌توان برای یافتن سریع تمام اعداد استفاده کرد.

 

پاسخ تشریحی

 

روش ۱: استفاده از حلقه و متغیر کمکی

def sum_numbers_in_string(text):

total_sum = 0 # متغیر برای ذخیره مجموع

current_number = "" # متغیر برای نگهداری عدد فعلی

 

for char in text:

if char.isdigit(): # اگر کاراکتر عددی است، به current_number اضافه شود

current_number += char

else:

if current_number: # اگر عددی قبلاً ساخته شده، آن را به مجموع اضافه کن

total_sum += int(current_number)

current_number = "" # ریست کردن متغیر برای عدد بعدی

 

if current_number: # بررسی آخرین عدد (در صورتی که در انتهای رشته باشد)

total_sum += int(current_number)

 

return total_sum

 

text = "abc123xyz45lmn7"

print(sum_numbers_in_string(text)) # خروجی: 175

 

توضیح کد:

  1. دو متغیر total_sum برای ذخیره مجموع و current_number برای نگهداری عدد فعلی تعریف می‌کنیم.
  2. روی text پیمایش می‌کنیم:
  • اگر کاراکتر عددی بود، آن را به current_number اضافه می‌کنیم.
  • اگر غیرعددی بود، مقدار current_number را به عدد تبدیل کرده و به مجموع اضافه می‌کنیم.
  • در انتها، اگر رشته به عدد ختم شود، بررسی می‌کنیم که مقدار نهایی اضافه شود.
  1. مقدار نهایی total_sum را برمی‌گردانیم.

 

چرا این روش کار می‌کند؟

✅ از حلقه for و متغیر کمکی استفاده کرده و نیازی به کتابخانه اضافی ندارد.

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

 

روش ۲: استفاده از re (تعبیر با عبارات منظم)

import re

 

def sum_numbers_regex(text):

numbers = re.findall(r'\d+', text) # پیدا کردن همه اعداد متوالی در رشته

return sum(map(int, numbers)) # تبدیل لیست اعداد به عدد صحیح و محاسبه مجموع

 

text = "abc123xyz45lmn7"

print(sum_numbers_regex(text)) # خروجی: 175

 

چرا این روش بهتر است؟

  • re.findall(r'\d+', text) تمام اعداد متوالی را در یک لیست استخراج می‌کند.
  • map(int, numbers) اعداد را از رشته به عدد تبدیل می‌کند.
  • بسیار سریع و خوانا است و در یک خط کد کار را انجام می‌دهد!

تمرین ۷: یافتن دو عدد در لیست که مجموعشان مقدار مشخصی شود

توضیح مسئله

برنامه‌ای بنویسید که یک لیست از اعداد و یک عدد هدف دریافت کند و دو عدد از لیست را پیدا کند که مجموعشان برابر عدد هدف باشد. اگر چنین زوجی وجود نداشت، مقدار None برگرداند.

مثال ورودی و خروجی

ورودی:

numbers = [2, 7, 11, 15]

target = 9

خروجی مورد انتظار:

(2, 7) # چون 2 + 7 برابر 9 است

راهنمایی

  • می‌توان از حلقه تو در تو استفاده کرد، اما این روش کند است (O(n²)).
  • روش بهینه‌تر استفاده از set یا dict برای بررسی سریع‌تر مقادیر است (O(n)).

پاسخ تشریحی

 

روش ۱: استفاده از دو حلقه (روش ساده اما ناکارآمد)

def find_pair_bruteforce(numbers, target):

for i in range(len(numbers)):

for j in range(i + 1, len(numbers)): # بررسی تمام جفت‌ها

if numbers[i] + numbers[j] == target:

return (numbers[i], numbers[j])

return None

 

numbers = [2, 7, 11, 15]

target = 9

print(find_pair_bruteforce(numbers, target)) # خروجی: (2, 7)

چرا این روش کند است؟

  • در بدترین حالت، همه جفت‌ها را بررسی می‌کند (O(n²)).
  • برای لیست‌های طولانی، کارایی خوبی ندارد.

روش ۲: استفاده از set برای بهینه‌سازی

def find_pair_optimized(numbers, target):

seen = set() # مجموعه برای نگه داشتن اعداد دیده‌شده

 

for num in numbers:

complement = target - num # عدد مورد نیاز برای رسیدن به target

if complement in seen:

return (complement, num) # زوج مناسب پیدا شد

seen.add(num) # اضافه کردن عدد فعلی به مجموعه

 

return None

 

numbers = [2, 7, 11, 15]

target = 9

print(find_pair_optimized(numbers, target)) # خروجی: (2, 7)

چرا این روش بهتر است؟

زمان اجرا O(n) است، چون فقط یک بار روی لیست حرکت می‌کنیم.

✅ از set برای بررسی سریع‌تر (O(1)) استفاده می‌شود.

تمرین ۸: تبدیل حروف کوچک به بزرگ و برعکس

توضیح مسئله

برنامه‌ای بنویسید که یک رشته ورودی را دریافت کند و تمام حروف کوچک را به بزرگ و حروف بزرگ را به کوچک تبدیل کند. بقیه کاراکترها (اعداد، فاصله، نشانه‌گذاری و …) بدون تغییر باقی بمانند.

مثال ورودی و خروجی

ورودی:

text = "PyThOn 123!"

خروجی مورد انتظار:

"pYtHoN 123!"

 

راهنمایی

  • می‌توان از حلقه for و متدهای isupper() و islower() برای بررسی نوع حروف استفاده کرد.
  • روش بهینه‌تر استفاده از متد آماده swapcase() است که همین کار را انجام می‌دهد.

پاسخ تشریحی

 

روش ۱: استفاده از for و بررسی دستی

def swap_case_manual(text):

new_text = ""

for char in text:

if char.isupper():

new_text += char.lower() # تبدیل به کوچک

elif char.islower():

new_text += char.upper() # تبدیل به بزرگ

else:

new_text += char # اگر کاراکتر حرف نبود، بدون تغییر اضافه شود

return new_text

 

text = "PyThOn 123!"

print(swap_case_manual(text)) # خروجی: "pYtHoN 123!"

چرا این روش کار می‌کند؟

آموزش مرتبط:  ربات هوشمند یافتن پروژه‌های برنامه‌نویسی متناسب با شما!

✅ از متدهای isupper() و islower() برای تشخیص حروف بزرگ و کوچک استفاده کرده‌ایم.

✅ در هر مرحله فقط یک تغییر انجام می‌شود، بنابراین ترتیب حفظ می‌شود.

روش ۲: استفاده از متد آماده swapcase()

def swap_case_builtin(text):

return text.swapcase() # خودکار تمام حروف را برعکس می‌کند

 

text = "PyThOn 123!"

print(swap_case_builtin(text)) # خروجی: "pYtHoN 123!"

چرا این روش بهتر است؟

  • بسیار سریع و خوانا است.
  • در یک خط کد عملیات را انجام می‌دهد.
  • از نظر عملکرد، متد swapcase() از لحاظ بهینه‌سازی داخلی سریع‌تر از حلقه دستی است.

تمرین ۹: پیدا کردن طولانی‌ترین کلمه در یک جمله

توضیح مسئله

برنامه‌ای بنویسید که یک جمله را دریافت کند و طولانی‌ترین کلمه را از آن استخراج کند. اگر چندین کلمه با بیشترین طول وجود داشتند، اولین مورد را برگرداند.

مثال ورودی و خروجی

ورودی:

sentence = "Python is an amazing programming language"

خروجی مورد انتظار:

"programming"

 

راهنمایی

  • می‌توان از split() برای جدا کردن کلمات جمله استفاده کرد.
  • از حلقه for برای بررسی طول هر کلمه استفاده کنید.
  • روش ساده‌تر، استفاده از max() همراه با پارامتر key=len است.

پاسخ تشریحی

 

روش ۱: استفاده از for و متغیر کمکی

def longest_word(sentence):

words = sentence.split() # جدا کردن کلمات با توجه به فاصله‌ها

longest = "" # متغیر برای نگه‌داشتن طولانی‌ترین کلمه

 

for word in words:

if len(word) > len(longest):

longest = word # جایگزینی در صورت پیدا کردن کلمه طولانی‌تر

 

return longest

 

sentence = "Python is an amazing programming language"

print(longest_word(sentence)) # خروجی: "programming"

چرا این روش کار می‌کند؟

✅ ابتدا جمله را به لیستی از کلمات تبدیل می‌کنیم.

✅ سپس با یک حلقه، طول هر کلمه را بررسی کرده و در صورت نیاز مقدار longest را به‌روز می‌کنیم.

روش ۲: استفاده از max() با key=len

def longest_word_max(sentence):

words = sentence.split()

return max(words, key=len) # پیدا کردن بیشترین مقدار بر اساس طول کلمه

 

sentence = "Python is an amazing programming language"

print(longest_word_max(sentence)) # خروجی: "programming"

چرا این روش بهتر است؟

✅ از تابع max() برای یافتن طولانی‌ترین مقدار در یک خط استفاده می‌کنیم.

✅ کد ساده‌تر و خواناتر است.

✅ زمان اجرا بهینه‌تر است زیرا مستقیماً مقدار بیشینه را پیدا می‌کند.

تمرین ۱۰: فاکتوریل یک عدد (بهینه و بازگشتی)

توضیح مسئله

برنامه‌ای بنویسید که یک عدد صحیح مثبت دریافت کرده و فاکتوریل آن را محاسبه کند.

(فاکتوریل n! برابر است با n × (n-1) × ... × 2 × 1 و مقدار 0! برابر ۱ است.)

 

مثال ورودی و خروجی

ورودی:

n = 5

خروجی مورد انتظار:

120 # چون 5 × 4 × 3 × 2 × 1 = 120

 

راهنمایی

  • می‌توان از یک حلقه for برای محاسبه فاکتوریل استفاده کرد.
  • روش بازگشتی (Recursive) نیز برای این مسئله پرکاربرد است.
  • برای اعداد خیلی بزرگ، math.factorial() سریع‌ترین گزینه است.

پاسخ تشریحی

 

روش ۱: استفاده از for (روش ساده و بهینه)

def factorial_iterative(n):

if n == 0 or n == 1:

return 1 # مقدار 0! و 1! برابر 1 است

 

result = 1

for i in range(2, n + 1): # از 2 تا n ضرب می‌کنیم

result *= i

return result

 

print(factorial_iterative(5)) # خروجی: 120

print(factorial_iterative(10)) # خروجی: 3628800

چرا این روش خوب است؟

✅ بدون نیاز به تابع بازگشتی کار می‌کند.

✅ پیچیدگی زمانی O(n) دارد که برای مقادیر بزرگ مناسب است.

✅ حلقه for ساده و خواناست.

روش ۲: استفاده از بازگشت (Recursive)

def factorial_recursive(n):

if n == 0 or n == 1:

return 1 # مقدار 0! و 1! برابر 1 است

return n * factorial_recursive(n - 1) # فراخوانی بازگشتی

 

print(factorial_recursive(5)) # خروجی: 120

مشکل این روش چیست؟

  • ممکن است باعث سرریز شدن پشته (Stack Overflow) برای اعداد بزرگ شود.
  • سرعت اجرای آن نسبت به روش for کندتر است.
  • پیچیدگی زمانی O(n) است، اما به‌خاطر فراخوانی‌های بازگشتی، حافظه بیشتری مصرف می‌کند.

روش ۳: استفاده از math.factorial() (بهترین روش برای اعداد خیلی بزرگ)

import math

 

def factorial_math(n):

return math.factorial(n) # سریع‌ترین روش برای محاسبه فاکتوریل

 

print(factorial_math(5)) # خروجی: 120

print(factorial_math(100)) # عددی بسیار بزرگ را محاسبه می‌کند

چرا این روش عالی است؟

✅ از الگوریتم‌های داخلی بهینه‌شده در Python استفاده می‌کند.

✅ برای اعداد خیلی بزرگ (مثل 100!) بدون خطای پشته اجرا می‌شود.

✅ خواناترین روش است.

جمع‌بندی

در این مقاله، ۱۰ تمرین کاربردی برای تقویت مهارت‌های پایتون را بررسی کردیم. این تمرین‌ها از مسائل ساده تا تکنیک‌های بهینه‌سازی را پوشش دادند و برای توسعه مهارت‌های برنامه‌نویسی مفید هستند.

مباحث کلیدی که یاد گرفتیم:

  • کار با رشته‌ها و لیست‌ها (مثل برعکس کردن رشته و حذف عناصر تکراری)
  • کار با اعداد و ریاضیات (مثل فاکتوریل و تشخیص عدد اول)
  • مدیریت داده‌ها و مجموعه‌ها (مثل شمارش تکرار کاراکترها و یافتن دو عدد با مجموع مشخص)
  • بهینه‌سازی الگوریتم‌ها (استفاده از set، dict و math برای بهبود کارایی)
  • استفاده از کتابخانه‌های داخلی پایتون (re، collections، math) برای حل مسائل به‌صورت کارآمد

📌 تمرین بیشتر:

اگر می‌خواهی مهارت‌های پایتونت را بیشتر تقویت کنی، می‌توانی:

  • تمرین‌های مشابه را با داده‌های مختلف اجرا کنی.
  • سعی کنی روش‌های بهینه‌تر و جدیدتری برای حل مسائل پیدا کنی.
  • همین تمرین‌ها را با استفاده از برنامه‌نویسی شی‌گرا (OOP) پیاده‌سازی کنی.
backendbaz

مدیر وب سایت بکندباز

دیدگاه‌ها

*
*