✍️ جستوجوی خطی از ابتدای فهرست جلو میرود و هر عضو را با هدف مقایسه میکند. لازم نیست ورودی مرتب باشد. اگر قرارمان «اولین شاخص» باشد، باید به محض رسیدن به اولین برابر، جواب را برگردونیم. ادامه دادن تا آخر و عوض کردن جواب ممکن است آخرین رخداد را تحویل بدهد؛ این یک قرارداد دیگر است.
def find_first(values, target):
for index, value in enumerate(values):
if value == target:
return index
return -1
print(find_first([7, 2, 7], 7)) # 0
enumerate هم شماره خانه را میدهد و هم مقدار را. وقتی هدف پیدا نشود، حلقه تمام میشود و -1 برمیگردد. این مقدار علامت قراردادی «پیدا نشد» است؛ نباید آن را بیبررسی برای دسترسی به فهرست استفاده کنی، چون در پایتون شاخص منفی به انتهای فهرست اشاره میکند.
برای ورودی خالی، اولین خط بعد از حلقه اجرا میشود و جواب همان -1 است. در بدترین حالت همه اعضا بررسی میشوند، پس هزینه خطی است. اشتباه رایج دیگر، برگرداندن خود مقدار بهجای شماره خانه است؛ مثلاً صفر بودن جواب لزوماً به معنی صفر بودن عضو نیست.
فعالیت شما
قرارداد find_first را بخوان: فهرست عددی نامرتب و target میگیرد، اولین شاخص هدف یا -1 را برمیگرداند؛ خالی و نبود هدف هر دو -1 هستند. این گام خواندنی است.