سوال :
https://www.codewars.com/kata/54eb33e5bc1a25440d000891/train/python جواب :
https://www.codewars.com/kata/reviews/551d6e6d5ed5abde4f000024/groups/61837282ff13ee00013c6206خب من این سوالو الان حل کردم
واقعا سنگین بود
یخورده شاید زیاد به نظر برسه ولی کلا یه تابع بازگشتی داره کار میکنه
یعنی تابع
_decompose()
بازگشت میخوره به خودش
و
decompose()
صرفا یه Abstraction برای اولیه
سوال در حالت کلی، جواب یکتا نداره یعنی فقط یه دنباله نمیتونه جواب سوال باشه و ممکنه دنباله هایی پیدا کنیم که همچنان جواب بدن ولی پاسخ سوال نباشن (اینکه چرا پاسخ سوال نیستن رو پایین توضیح دادم) مثلا برای عدد 50
14 48
1 3 5 8 49
میتونن جواب باشن
اما یه نکته داره اونم اینکه "باید" نزدیکترین عدد مربع کامل رو پیدا کنی مثلا برای 2500 نزدیکترین عدد مربع کامل 2401 هست. " مگر اینکه " اون عدد قبلا پردازش شده باشه تو لیست output موجود باشه که در اینصورت، باید برگردیم به مرحله قبلش و...
همین کد رو راحت میتونین بخونین چیزی نداره کافیه یه عدد مثل 12 بدین بهش مرحله به مرحله trace کنین(زیاد نیست حتی با دو سه مرحله اول متوجه میشین چه اتفاقی میوفته)
یه سری اضافه کاری مثل filter و try except داره که اونارو دیگه میتونین تو همون تابع بازگشتی اوکی کنین با شرط ها که مثلا index از طول لیست ouput بیشتر نشه و اگه شد return output بشه
چرا output رو اونجوری تعریف کردم؟
دلیل خاصی نداره
فقط نخواستم هی بعدا لیست رو با لیست جمع بزنم
یعنی یجورایی اومدم رزرو کردم چند تا خونه رو، که بعدا پرش کنم
چرا تعدادش 20 تاس؟ چون حدسم از تست کیس ها این بود، بیشتر از این نمیتونه بشه و حتی از اینم کمتره فکر کنم در حد 5 6 تا باشه اخرش..
اگر بخواد عددی بده که دنباله بیشتر از 20 30 تا بشه باید بریم سراغ while for برای همین کد وارز اعداد کوچیکی رو میده چون در غیر اینصورت stack سیستم عامل رو پر میکنه و ارور میده...
این تغییراتی که گفتم بدین خیلی بهینه میشه
بهینه تر ازینم که میتونین تبدیل به حلقه ش کنین و تابع بازگشتی نزنین
الگوریتمش به این شکله که مثلا ما برای عدد 50 داریم
50^2 = 49^2 + 99
99 = 9^2 + 18
18 = 4^2 + 2
2= 1^2 + 1
1= 1^2+0
اینجا عدد 1 قبلا تو لیست اضافه شده
برای همین یه step برمیگرده عقب و
18=4^2+2
رو پردازش میکنه از 4 یدونه کم میکنه
18=3^2 + 9
9 = 3^2
بازم 3 تو لیست تکراری میشه
پس دوباره برمیگرده به مرحله قبلیش یعنی مرحله مربوط به عدد 18، مشکل داره پس میریم سراغ 99 و یک واحد کم میکنیم از اونی که قبلا داشته (یعنی از 9 یدونه کم میکنیم)
99= 8^2+35
این دیگه جواب میده و دنباله چاپ میشه
ارسال شده توسط:
@awakeforaflip@raspberry_pythonشمام اگه سوال خفنی حل کردید یا پروژه خفنی انجام دادید میتونید با بقیه دوستاتون تو کانال به اشتراک بزارید