یک جایگشت (permutation) از یک لیست، روشی برای تغییر ترتیب عناصر آن است. برای مثال، لیست [1, 2, 3]
دارای جایگشتهای زیر است:
[1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1]
این چالش درباره جایگشتهای تو در تو (نسپرها) است که همان ایده جایگشتها را دارد، اما برای لیستهای تو در تو اعمال میشود.
برای مثال، نسپرهای لیست [1, [2, 3]]
به این صورت هستند:
[1, [2, 3]] [1, [3, 2]] [[2, 3], 1] [[3, 2], 1]
توجه کنید که همانطور که از نام آن مشخص است، نسپرها باید ساختار لیست تو در تو را حفظ کنند. بنابراین، [2, [1, 3]]
یک نسپر از [1, [2, 3]]
نیست، زیرا ۱ و ۲ در سطوح مختلف تو در تو قرار دارند.
به عبارت دیگر، یک نسپر هر سطح از لیست را به عنوان یک مجموعه در نظر میگیرد (یعنی ترتیب میتواند تغییر کند)، اما عناصر نمیتوانند بین مجموعهها جابهجا شوند.
تابعی بنویسید که با دریافت یک لیست تو در تو، تعداد نسپرهای آن لیست را برگرداند.
برای درک چگونگی محاسبه تعداد نسپرها، به یک مثال بزرگتر نگاه میکنیم. به یاد داشته باشید که اگر یک لیست n
عنصر داشته باشد، n! = n*(n-1)*(n-2)*...*3*2*1
جایگشت وجود دارد.
به عنوان مثال، ادعا میکنم که لیست [[1, 7], 3, [2, 4, 5, 6]]
دارای 3! * 2! * 4!
نسپر است. چرا؟ زیرا 3!
جایگشت برای سطح بیرونی، 2!
جایگشت برای سطح [1, 7]
و 4!
جایگشت برای سطح [2, 4, 5, 6]
وجود دارد.
نمونه ورودی و خروجی
Nespers([1, 2, 3]) ➞ 6
Nespers([1, [2, 3]]) ➞ 4
Nespers([[1, 7], 3, [2, 4, 5, 6]]) ➞ 288
نکات
- عناصر داخل لیست تو در تو همیشه متمایز هستند، تا از سوالات مربوط به یکسانبودن دو نسپر جلوگیری شود.
- برخی از سطوح تو در تو ممکن است خالی باشند. به یاد داشته باشید که
0! = 1
.
Nespers([1, 2, 3]) ➞ 6
Nespers([1, [2, 3]]) ➞ 4
Nespers([[1, 7], 3, [2, 4, 5, 6]]) ➞ 288
Nespers([1, [3, [2, [5, 4]]]]) ➞ 16
Nespers([1, 2, 3, 4, 5]) ➞ 120
Nespers([[], 1, [3, [2, [5, 4]]]]) ➞ 48
Nespers([6, [], 1, [3, [2, [5, [], 4]]]]) ➞ 576
نظرات