🐍 Π‘Π°ΠΌΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ Python для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…. Π§Π°ΡΡ‚ΡŒ 13: РСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

РасскаТСм, Π² ΠΊΠ°ΠΊΠΈΡ… случаях стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ, Ρ‡Π΅ΠΌ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π»ΡƒΡ‡ΡˆΠ΅ рСкурсивного ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ рСкурсивных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Python. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρ€Π΅ΡˆΠΈΠΌ 10 практичСских Π·Π°Π΄Π°Ρ‡ двумя способами – рСкурсивным ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ.

РСкурсивная функция – это функция, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сама сСбя, ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅, созданныС Π²ΠΎ врСмя ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΅ΡΡ‚ΡŒ ряд Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΡ‰Π΅ (Π½ΠΎ Π½Π΅ всСгда эффСктивнСС) Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсии. НаписаниС рСкурсивных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ часто ставит Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… программистов Π² Ρ‚ΡƒΠΏΠΈΠΊ. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ рСкурсивных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ (Π² самых ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ…) ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

Π‘Ρ‚Π΅ΠΊ – это структура Π΄Π°Π½Π½Ρ‹Ρ… LIFO (last in, first out): информация ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ добавляСтся Π² «стопку» , ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ помСщаСтся ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ, Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС, – начиная с Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ. Π Π°Π±ΠΎΡ‚Ρƒ стСка ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² список с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ append ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ посрСдством pop:

stack = []
for i in range(1, 11):
    stack.append(f'{i}-ΠΉ элСмСнт')
    print(f'+ {i}-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½')
    for i in stack:
        print(i, end=" ")
print('\n')    
for i in range(len(stack)):
    print('Π’ стСкС: ', end=" ")
    for i in stack:
        print(i, end=" ")
    print(f'\n{stack.pop()} ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка')

Π’Ρ‹Π²ΠΎΠ΄:

+ 1-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
1-ΠΉ элСмСнт + 2-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
1-ΠΉ элСмСнт 2-ΠΉ элСмСнт + 3-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт + 4-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт + 5-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт + 6-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 6-ΠΉ элСмСнт + 7-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 6-ΠΉ элСмСнт 7-ΠΉ элСмСнт + 8-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 6-ΠΉ элСмСнт 7-ΠΉ элСмСнт 8-ΠΉ элСмСнт + 9-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 6-ΠΉ элСмСнт 7-ΠΉ элСмСнт 8-ΠΉ элСмСнт 9-ΠΉ элСмСнт + 10-ΠΉ элСмСнт Π΄ΠΎΠ±Π°Π²Π»Π΅Π½
1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 6-ΠΉ элСмСнт 7-ΠΉ элСмСнт 8-ΠΉ элСмСнт 9-ΠΉ элСмСнт 10-ΠΉ элСмСнт 

Π’ стСкС:  1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 6-ΠΉ элСмСнт 7-ΠΉ элСмСнт 8-ΠΉ элСмСнт 9-ΠΉ элСмСнт 10-ΠΉ элСмСнт 
10-ΠΉ элСмСнт ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка
Π’ стСкС:  1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 6-ΠΉ элСмСнт 7-ΠΉ элСмСнт 8-ΠΉ элСмСнт 9-ΠΉ элСмСнт 
9-ΠΉ элСмСнт ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка
Π’ стСкС:  1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 6-ΠΉ элСмСнт 7-ΠΉ элСмСнт 8-ΠΉ элСмСнт 
8-ΠΉ элСмСнт ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка
Π’ стСкС:  1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 6-ΠΉ элСмСнт 7-ΠΉ элСмСнт 
7-ΠΉ элСмСнт ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка
Π’ стСкС:  1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 6-ΠΉ элСмСнт 
6-ΠΉ элСмСнт ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка
Π’ стСкС:  1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 5-ΠΉ элСмСнт 
5-ΠΉ элСмСнт ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка
Π’ стСкС:  1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 4-ΠΉ элСмСнт 
4-ΠΉ элСмСнт ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка
Π’ стСкС:  1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 3-ΠΉ элСмСнт 
3-ΠΉ элСмСнт ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка
Π’ стСкС:  1-ΠΉ элСмСнт 2-ΠΉ элСмСнт 
2-ΠΉ элСмСнт ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка
Π’ стСкС:  1-ΠΉ элСмСнт 
1-ΠΉ элСмСнт ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· стСка

Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, – это ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создаСтся Ρ„Ρ€Π΅ΠΉΠΌ – Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ памяти, – Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ содСрТится:

  • информация ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ состоянии выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ;
  • значСния всСх ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ функция ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ;
  • Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, созданныС Π²ΠΎ врСмя ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°;
  • свСдСния ΠΎ строкС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ послС выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π€Ρ€Π΅ΠΉΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅, ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, свСрху Π²Π½ΠΈΠ·. РСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, созданныС Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚Ρƒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² – созданиСм Ρ„Ρ€Π΅ΠΉΠΌΠΎΠ² ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ стСком занимаСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Однако ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ созданиС рСкурсивных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. НСвСрноС ΠΆΠ΅ использованиС рСкурсии ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ стСка (stack overflow). ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½Ρ‹ΠΉ сайт StackOverflow Π½Π°Π·Π²Π°Π½ ΠΊΠ°ΠΊ Ρ€Π°Π· Π² Ρ‡Π΅ΡΡ‚ΡŒ этой ошибки.

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ стСк Π² ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… цСлях ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая бСсконСчно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сама сСбя, Π½ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅ содСрТит Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ условия для прСкращСния своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹:

def recursive():
    recursive()

recursive()

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python автоматичСски отслСТиваСт ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ стСка ΠΈ послС 1000 бСсплодных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ошибкой:

shortest()
RecursionError: maximum recursion depth exceeded

ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π»ΠΈΠΌΠΈΡ‚ Π½Π° Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ рСкурсии ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ, Π½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ бСсконСчным, разумССтся, нСльзя – Π΄Π°ΠΆΠ΅ самый Π²Π½ΡƒΡˆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ объСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π² ΠΈΡ‚ΠΎΠ³Π΅ окаТСтся ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ:

from sys import getrecursionlimit
from sys import setrecursionlimit
print(getrecursionlimit()) # Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π»ΠΈΠΌΠΈΡ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
setrecursionlimit(2000) # ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π»ΠΈΠΌΠΈΡ‚ Π΄ΠΎ 2000 Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²
print(getrecursionlimit())# Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ Π»ΠΈΠΌΠΈΡ‚

#Π’Ρ‹Π²ΠΎΠ΄:
1000
2000

Π§Ρ‚ΠΎΠ±Ρ‹ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π½Π΅ пСрСполнялся, Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всСгда Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ прСдусмотрСны Π΄Π²Π° случая:

  1. Π“Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ функция Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.
  2. РСкурсивный, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ функция ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ сСбя.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΡ‡Ρ‚Π΅Π½Ρ‹ ΠΎΠ±Π° случая:

def greetings(st):
     print(st)
     if len(st) == 0:  # Π“Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай
         return             
     else:       # РСкурсивный случай
         greetings(st[:-1])   

greetings('Hello, world!')

Π’Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π΄Π»ΠΈΠ½Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ подстроки достигаСт 0:

Hello, world!
Hello, world
Hello, worl
Hello, wor
Hello, wo
Hello, w
Hello, 
Hello,
Hello
Hell
Hel
He
H

Π­Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ условиС провСряло ΠΈ Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ, ΠΈ рСкурсивный случаи сразу:

def greetings(st):
    print(st)
    if len(st) > 0:  
        greetings(st[:-1])   

greetings('Hello world!')

И Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ, ΠΈ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ рСкурсивный случай ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ greetings() подстроку, Π΄Π»ΠΈΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ, ΠΏΠΎΠΊΠ° Π½Π΅ станСт Ρ€Π°Π²Π½ΠΎΠΉ 0.

πŸπŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ Python
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ PythonΒ»
🐍🧩 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Python для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ PythonΒ»

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния: итСрация vs рСкурсия

РСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ…, поэтому ΠΈΡ… стоит ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ Π±Π΅Π· рСкурсии слоТно. Π’ΠΎΡ‚ сравнСниС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π΄Π²ΡƒΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, рСкурсивной fib_recursive(n) ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ fib_iter(n), Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΡ… ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡Ρƒ – вычислСниС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ:

from timeit import timeit

def fib_iter(n):
    if n == 1:
        return [1]
    if n == 2:
        return [1, 1]
    fibs = [1, 1]
    for _ in range(2, n):
        fibs.append(fibs[-1] + fibs[-2])
    return fibs

setup_code_iter = 'from __main__ import fib_iter'
stmt_iter = 'fib_iter(15)'
print('ВрСмя выполнСния ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ', timeit(setup=setup_code_iter, stmt=stmt_iter, number=20000))

def fib_recursive(n):
    if(n <= 1):
        return n
    else:
        return(fib_recursive(n-1) + fib_recursive(n-2))
    
setup_code_rec = 'from __main__ import fib_recursive'
stmt_rec = 'fib_recursive(15)'
print('ВрСмя выполнСния рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ', timeit(setup=setup_code_rec, stmt=stmt_rec, number=20000))

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ для n = 15:

ВрСмя выполнСния ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:  0.034556168131530285
ВрСмя выполнСния рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:  4.069674882106483

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ†ΠΈΠΊΠ» for. Π¦ΠΈΠΊΠ» выполняСт ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ (ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€), ΠΏΡ€ΠΈΡ‡Π΅ΠΌ справляСтся с Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС, Ρ‡Π΅ΠΌ рСкурсивная функция, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рСкурсия ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ мноТСство ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΈ с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ числа элСмСнтов ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ количСство ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ² растСт Π»Π°Π²ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎ:

РСкурсивныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΡ€ΠΈ вычислСнии ряда Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ

Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ рСкурсии. ВсСгда, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ (Π»ΠΈΠ±ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ с использованиСм стСка), слСдуСт Π΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ Ρ†ΠΈΠΊΠ»Π° for ΠΈΠ»ΠΈ while вмСсто рСкурсии.

ΠœΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΡ

Если ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ рСкурсии ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ, Π΅ΡΡ‚ΡŒ простой способ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ – для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ @lru_cache() модуля functools. Π‘Ρ€Π°Π²Π½ΠΈΠΌ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния рСкурсивного ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠ»ΠΈΠΌΠΏΠΈΠ°Π΄Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ.

Π—Π°Π΄Π°Ρ‡Π°: лСсСнка прСдставляСт собой Π½Π°Π±ΠΎΡ€ ΠΊΡƒΠ±ΠΈΠΊΠΎΠ². Π’ этом Π½Π°Π±ΠΎΡ€Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ряд состоит ΠΈΠ· мСньшСго числа ΠΊΡƒΠ±ΠΈΠΊΠΎΠ², Ρ‡Π΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ. Надо Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для вычислСния количСства лСсСнок, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈΠ· n ΠΊΡƒΠ±ΠΈΠΊΠΎΠ².

ЛСсСнка состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… рядов ΠΊΡƒΠ±ΠΈΠΊΠΎΠ²

Π’ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ рСкурсивная функция, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π΅ Python Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ строгим ΠΎΠ»ΠΈΠΌΠΏΠΈΠ°Π΄Π½Ρ‹ΠΌ критСриям. Для ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π° ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ, ΡƒΠΆΠ΅ упомянутым Π²Ρ‹ΡˆΠ΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Π‘Ρ€Π°Π²Π½ΠΈΠΌ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ с ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π±Π΅Π·:

from timeit import timeit

def kol_les_no_mem(n, k):
    if n == 0:
        return 1
    ans = 0
      
    for i in range(k + 1, n + 1):
        ans += kol_les_no_mem(n - i,  i)
    return ans

setup_code_no_mem = 'from __main__ import kol_les_no_mem'
stmt_no_mem = 'kol_les_no_mem(25, 0)'
print('ВрСмя выполнСния Π±Π΅Π· ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠΈ: ', timeit(setup=setup_code_no_mem, stmt=stmt_no_mem, number=20000))

setup_code_mem = '''
import functools
@functools.lru_cache(maxsize=None)

def kol_les_mem(n, k):
    if n == 0:
        return 1
    ans = 0
      
    for i in range(k + 1, n + 1):
        ans += kol_les_mem(n - i,  i)
    return ans
'''

stmt_mem = 'kol_les_mem(25, 0)'
print('ВрСмя выполнСния с ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ: ', timeit(setup=setup_code_mem, stmt=stmt_mem, number=20000))

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ тСста:

ВрСмя выполнСния Π±Π΅Π· ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠΈ:  9.019254605285823
ВрСмя выполнСния с ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ:  0.0023915572091937065

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°

Π—Π°Π΄Π°Π½ΠΈΠ΅ 1

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для вычислСния Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° числа. Π Π΅ΡˆΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‡Ρƒ двумя способами – ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΈ рСкурсивным.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ для рСкурсивного Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ: ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ 5! Π€Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» 5 Ρ€Π°Π²Π΅Π½: 5 Ρ… 4 Ρ… 3 Ρ… 2 Ρ… 1. Π€Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» 4: 4 Ρ… 3 Ρ… 2 Ρ… 1, Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» 3: 3 Ρ… 2 Ρ… 1, Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» 2: 2 Ρ… 1, ΠΈ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» 1 Ρ€Π°Π²Π΅Π½ 1. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ 5! = 5 x 4!, 4! = 4 x 3!, 3! = 3 x 2! ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ Π΄ΠΎ Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ случая 1! = 1, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°:

12

Π’Ρ‹Π²ΠΎΠ΄:

479001600

РСшСниС 1 – ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅:

def fact_iter(n):
    factorial = 1
    for i in range(1, n + 1):
        factorial *= i
    return factorial
print(fact_iter(int(input())))

РСшСниС 2 – рСкурсивноС:

def fact_recursive(n):
    if n == 1: # Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай
        return 1
    else: # рСкурсивный случай
        return n * fact_recursive(n - 1)
print(fact_recursive(int(input())))

Π—Π°Π΄Π°Π½ΠΈΠ΅ 2

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для возвСдСния числа n Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ m. Π Π΅ΡˆΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‡Ρƒ двумя способами – ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΈ рСкурсивным.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ для рСкурсивного Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ: ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ возвСсти число 5 Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ 6. Бвойства стСпСни ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ процСсс Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ 5 ** 6 Π² Π²ΠΈΠ΄Π΅ (5 ** 3) ** 2. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ прСдставляСт собой Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ число. Если ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ нСчСтная, слСдуСт Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌ свойством: (n ** m) x n = n ** (m + 1). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ввСсти ΠΊΠ°ΠΊ Ρ‡Π΅Ρ‚Π½ΠΎΠ΅, Ρ‚Π°ΠΊ ΠΈ Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ m, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π΄Π²Π° рСкурсивных случая. Π’ качСствС Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΎΠ³ΠΎ случая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ свойство стСпСни: n ** 1 = n.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°:

12
8

Π’Ρ‹Π²ΠΎΠ΄:

429981696

РСшСниС 1 – ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅:

def pow_iter(n, m):
    res = 1
    for i in range(m):
        res *= n
    return res
n, m = int(input()), int(input())
print(pow_iter(n, m))

РСшСниС 2 – рСкурсивноС:

def pow_recursive(n, m):
    if m == 1: # Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай
        return n
    elif m % 2 == 0: # Ρ‡Π΅Ρ‚Π½Ρ‹ΠΉ рСкурсивный случай
        res = pow_recursive(n, m // 2)
        return res * res
    else: # Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΉ рСкурсивный случай
        res = pow_recursive(n, m // 2)
        return res * res * n
n, m = int(input()), int(input())
print(pow_recursive(n, m))

Π—Π°Π΄Π°Π½ΠΈΠ΅ 3

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для нахоТдСния n-Π³ΠΎ гармоничСского числа. Π Π΅ΡˆΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΈ рСкурсивным способами.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°:

7

Π’Ρ‹Π²ΠΎΠ΄:

2.5928571428571425

РСшСниС 1 – ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅:

def nth_harmonic_iter(n):
    harmonic = 1.0
    for i in range(2, n + 1):
        harmonic += 1 / i
    return harmonic
print(round(nth_harmonic_iter(int(input())), 5))

РСшСниС 2 – рСкурсивноС:

def nth_harmonic_rec(n):
    if n == 1: #Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай
        return 1
    else: #рСкурсивный случай
        return 1 / n + nth_harmonic_rec(n - 1)
print(round(nth_harmonic_rec(int(input())), 5))

Π—Π°Π΄Π°Π½ΠΈΠ΅ 4

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΈ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для вычислСния суммы n ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² гСомСтричСской прогрСссии:

ΠŸΡ€ΠΎΠ³Ρ€Π΅ΡΡΠΈΡ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°:

9

Π’Ρ‹Π²ΠΎΠ΄:

1.99609375

РСшСниС 1 – ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅:

def geometric_iter(n):
    res = 0
    for i in range(n):
        res += 1 / 2 ** i
    return res    
print(geometric_iter(int(input())))

РСшСниС 2 – рСкурсивноС:

def geometric_rec(n):
   if n < 0: # Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай
       return 0
   else: # рСкурсивный случай
       return 1 / 2 ** n + geometric_rec(n - 1)
print(geometric_rec(int(input())))

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Ссли Π·Π½Π°ΠΌΠ΅Π½Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Ρ€Π°Π²Π΅Π½ 1, Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ суммы n ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Ρ‡Π»Π΅Π½ΠΎΠ² гСомСтричСской прогрСссии:

b, q, n = 1, 0.5, int(input())
print(b * (1 - q ** n) / (1 - q))

Π—Π°Π΄Π°Π½ΠΈΠ΅ 5

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для вычислСния наибольшСго ΠΎΠ±Ρ‰Π΅Π³ΠΎ дСлитСля чисСл a ΠΈ b.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°:

45
123

Π’Ρ‹Π²ΠΎΠ΄:

3

РСшСниС 1 – рСкурсивноС:

def gcd_recursive(a, b):
    min_num = min(a, b)
    max_num = max(a, b)

    if min_num == 0: #Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎ ΠΈΠ· чисСл Ρ€Π°Π²Π½ΠΎ 0
        return max_num
    elif min_num == 1: #Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎ ΠΈΠ· чисСл Ρ€Π°Π²Π½ΠΎ 1
        return 1
    else: #рСкурсивный случай, ΠΊΠΎΠ³Π΄Π° Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· чисСл Π½Π΅ Ρ€Π°Π²Π½ΠΎ Π½ΠΈ 1, Π½ΠΈ 0
        return gcd_recursive(min_num, max_num % min_num)
a, b = int(input()), int(input())
print(gcd_recursive(a, b))

РСшСниС 2 – ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅:

def gcd_iter(a, b):
    while a != b:
        if a > b:
            a -= b
        else:
            b -= a
    return b        
a, b = int(input()), int(input())
print(gcd_iter(a, b))

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ math.gcd():

import math
a, b = int(input()), int(input())
print(math.gcd(a, b))

Π—Π°Π΄Π°Π½ΠΈΠ΅ 6

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΈ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для вычислСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ n + (n – 2) + (n – 4)... (n – x =< 0), Π³Π΄Π΅ n – Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎΠ΅ Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ число.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°:

120

Π’Ρ‹Π²ΠΎΠ΄:

3660

РСшСниС 1 – ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅:

def sum_iter(n):
    summa = 0
    k = 0
    while n - k > 0:
        summa += n - k 
        k += 2
    return summa    
print(sum_iter(int(input())))

РСшСниС 2 – рСкурсивноС:

def sum_recursive(n):
    if n < 1: # Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай
        return 0
    else: # рСкурсивный случай
        return n + sum_recursive(n - 2)
        
print(sum_recursive(int(input())))

Π—Π°Π΄Π°Π½ΠΈΠ΅ 7

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая опрСдСляСт, являСтся Π»ΠΈ ввСдСнная ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ строка ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠΎΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄Π°:

Π›Ρ‘ΡˆΠ° Π½Π° ΠΏΠΎΠ»ΠΊΠ΅ ΠΊΠ»ΠΎΠΏΠ° Π½Π°ΡˆΡ‘Π»

Π’Ρ‹Π²ΠΎΠ΄:

True

РСшСниС:

def palindrome(my_str):
    if len(my_str) == 0 or len(my_str) == 1: # Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай
        return True
    else: # рСкурсивный случай
        head = my_str[0]
        middle = my_str[1:-1]
        end = my_str[-1]
        return head == end and palindrome(middle)

st = [i.lower() for i in input() if i.isalpha()]
print((palindrome(st)))

Π‘Π΅Π· рСкурсии Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ:

st = [i.lower() for i in input() if i.isalpha()]
print(st == st[::-1])

Π—Π°Π΄Π°Π½ΠΈΠ΅ 8

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для поиска ΠΈΠΌΠ΅Π½ΠΈ, состоящСго Ρ€ΠΎΠ²Π½ΠΎ ΠΈΠ· 9 Π±ΡƒΠΊΠ². Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° родословной, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранятся Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ± ΠΈΠΌΠ΅Π½Π°Ρ…, ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ:

Родословная

Π’Ρ‹Π²ΠΎΠ΄:

ΠŸΠΎΡΠ΅Ρ‰Π°Π΅ΠΌ ΡƒΠ·Π΅Π» Анна...
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, состоит Π»ΠΈ имя Анна ΠΈΠ· 9 Π±ΡƒΠΊΠ²...
ΠŸΠΎΡΠ΅Ρ‰Π°Π΅ΠΌ ΡƒΠ·Π΅Π» Π•Π³ΠΎΡ€...
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, состоит Π»ΠΈ имя Π•Π³ΠΎΡ€ ΠΈΠ· 9 Π±ΡƒΠΊΠ²...
ΠŸΠΎΡΠ΅Ρ‰Π°Π΅ΠΌ ΡƒΠ·Π΅Π» ΠœΠ°Ρ€ΠΈΡ...
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, состоит Π»ΠΈ имя ΠœΠ°Ρ€ΠΈΡ ΠΈΠ· 9 Π±ΡƒΠΊΠ²...
ΠŸΠΎΡΠ΅Ρ‰Π°Π΅ΠΌ ΡƒΠ·Π΅Π» Π‘Π²Π΅Ρ‚Π»Π°Π½Π°...
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, состоит Π»ΠΈ имя Π‘Π²Π΅Ρ‚Π»Π°Π½Π° ΠΈΠ· 9 Π±ΡƒΠΊΠ²...
ΠŸΠΎΡΠ΅Ρ‰Π°Π΅ΠΌ ΡƒΠ·Π΅Π» Инга...
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, состоит Π»ΠΈ имя Инга ΠΈΠ· 9 Π±ΡƒΠΊΠ²...
ΠŸΠΎΡΠ΅Ρ‰Π°Π΅ΠΌ ΡƒΠ·Π΅Π» Π•Π»ΠΈΠ·Π°Π²Π΅Ρ‚Π°...
ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, состоит Π»ΠΈ имя Π•Π»ΠΈΠ·Π°Π²Π΅Ρ‚Π° ΠΈΠ· 9 Π±ΡƒΠΊΠ²...
Имя ΠΈΠ· 9 Π±ΡƒΠΊΠ²: Π•Π»ΠΈΠ·Π°Π²Π΅Ρ‚Π°

РСшСниС:

root = {'name': 'Анна', 'children': [{'name': 'Π•Π³ΠΎΡ€', 'children':
[{'name': 'ΠœΠ°Ρ€ΠΈΡ', 'children': []}]}, {'name': 'Π‘Π²Π΅Ρ‚Π»Π°Π½Π°',
'children': [{'name': 'Инга', 'children': [{'name': 'Π•Π»ΠΈΠ·Π°Π²Π΅Ρ‚Π°',
'children': []}, {'name': 'Антон', 'children': []}]}, {'name': 'ΠœΠ°Ρ€ΠΈΠ½Π°', 'children': []}]}]}

def find_name(node):
    print(f"ΠŸΠΎΡΠ΅Ρ‰Π°Π΅ΠΌ ΡƒΠ·Π΅Π» {node['name']}...")
    print(f"ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, состоит Π»ΠΈ имя {node['name']} ΠΈΠ· 9 Π±ΡƒΠΊΠ²...")
    if len(node['name']) == 9: 
        return node['name'] # Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай

    if len(node['children']) > 0:  # рСкурсивный случай
        for child in node['children']:
            returnValue = find_name(child)
            if returnValue != 'Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ':
                return returnValue

    return 'Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ' # Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай - ΠΈΠΌΠ΅Π½ ΠΈΠ· 9 Π±ΡƒΠΊΠ² Π½Π΅Ρ‚

print(f"Имя ΠΈΠ· 9 Π±ΡƒΠΊΠ²: {find_name(root)}")

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π±Π΅Π· рСкурсии Ρ‚Π°ΠΊΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ООП:

class Node:
    def __init__(self, data=None, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

def traverse(root):
    if root is None:
        return

    traverse(root.left)
    if len(root.data) == 9:
        print(f'Имя найдСно: {root.data}')
        return
 
    traverse(root.right)
    if len(root.data) == 9:
        print(f'Имя найдСно: {root.data}')
        return

 
if __name__ == '__main__':
    root = Node('Анна')
    root.left = Node('Π•Π³ΠΎΡ€')
    root.right = Node('Π‘Π²Π΅Ρ‚Π»Π°Π½Π°')
    root.left.left = Node('ΠœΠ°Ρ€ΠΈΡ')
    root.right.left = Node('Инга')
    root.right.right = Node('ΠœΠ°Ρ€ΠΈΠ½Π°')
    root.right.left.left = Node('Π•Π»ΠΈΠ·Π°Π²Π΅Ρ‚Π°')
    root.right.left.right = Node('Антон')
 
    traverse(root)

Π—Π°Π΄Π°Π½ΠΈΠ΅ 9

Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список:

sp = [[[5, 7, 2], [4, 9, 5]], [[2, 5, 4]], [[3, 2, 1], [[5], [9, 5]]],
      [4, 3, 1, 2], [[4, 7, 2], [6, 4]], [[[4, 1, 6], [3, 8]], [4, 5]],
      [9, 1], [3, 1], [[5, 6], [[4, 2, 1], [2, 5], [[6, 8, 2, 3, 4]]]],
      [5, 3, 2], [2, [1], 4], [2, 5, [4, 3, 1], 6, 7, [9, 0, 5, 2, 4]],
      [7, 3, [4]], [4, 2, [[[5, 6, 7], 5, 7]], 1], [3, 4, 6, [6, 4, 5]],
     ]

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для прСобразования списка Π² ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ.

ΠžΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

[5, 7, 2, 4, 9, 5, 2, 5, 4, 3, 2, 1, 5, 9, 5, 4, 3, 1, 2, 4, 7, 2, 6, 4, 4, 1, 6, 3, 8, 4, 5, 9, 1, 3, 1, 5, 6, 4, 2, 1, 2, 5, 6, 8, 2, 3, 4, 5, 3, 2, 2, 1, 4, 2, 5, 4, 3, 1, 6, 7, 9, 0, 5, 2, 4, 7, 3, 4, 4, 2, 5, 6, 7, 5, 7, 1, 3, 4, 6, 6, 4, 5]

РСшСниС 1 – рСкурсивноС:

def flat_list_recur(lst):
    if lst == []:
        return lst
    if isinstance(lst[0], list):
        return flat_list_recur(lst[0]) + flat_list_recur(lst[1:])
    return lst[:1] + flat_list_recur(lst[1:])

sp = [[[5, 7, 2], [4, 9, 5]], [[2, 5, 4]], [[3, 2, 1], [[5], [9, 5]]],
      [4, 3, 1, 2], [[4, 7, 2], [6, 4]], [[[4, 1, 6], [3, 8]], [4, 5]],
      [9, 1], [3, 1], [[5, 6], [[4, 2, 1], [2, 5], [[6, 8, 2, 3, 4]]]],
      [5, 3, 2], [2, [1], 4], [2, 5, [4, 3, 1], 6, 7, [9, 0, 5, 2, 4]],
      [7, 3, [4]], [4, 2, [[[5, 6, 7], 5, 7]], 1], [3, 4, 6, [6, 4, 5]],
     ]
print(flat_list_recur(sp))

РСшСниС 2 – ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅:

def flat_list_iter(lst):
    result = []
    stack = [lst]
    while stack:
        current = stack.pop(-1)
        if isinstance(current, list):
            stack.extend(current)
        else:
            result.append(current)
    result.reverse() 
    return result

sp = [[[5, 7, 2], [4, 9, 5]], [[2, 5, 4]], [[3, 2, 1], [[5], [9, 5]]],
      [4, 3, 1, 2], [[4, 7, 2], [6, 4]], [[[4, 1, 6], [3, 8]], [4, 5]],
      [9, 1], [3, 1], [[5, 6], [[4, 2, 1], [2, 5], [[6, 8, 2, 3, 4]]]],
      [5, 3, 2], [2, [1], 4], [2, 5, [4, 3, 1], 6, 7, [9, 0, 5, 2, 4]],
      [7, 3, [4]], [4, 2, [[[5, 6, 7], 5, 7]], 1], [3, 4, 6, [6, 4, 5]],
     ]

print(flat_list_iter(sp))

Π—Π°Π΄Π°Π½ΠΈΠ΅ 10

Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΈ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Число задаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ randrange(2000), Π² спискС хранятся числа ΠΎΡ‚ 1 Π΄ΠΎ 1000, Ρ‚.Π΅. Π½Π΅ Π²ΠΎ всСх случаях Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ число Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² спискС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°:

Число найдСно: 787

РСшСниС 1 – рСкурсивноС:

from random import randrange

def binary_recursive(lst, start, end, num):
    if end >= start:  
        mid = (end + start) // 2
        if lst[mid] == num: # Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай - элСмСнт находится посСрСдинС
            return mid
        
        elif lst[mid] > num: # рСкурсивный случай - элСмСнт находится слСва
            return binary_recursive(lst, start, mid - 1, num)

        else: # рСкурсивный случай - элСмСнт находится справа
            return binary_recursive(lst, mid + 1, end, num)

    else: # Π³Ρ€Π°Π½ΠΈΡ‡Π½Ρ‹ΠΉ случай - элСмСнт Π² спискС Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½
         return 'Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ'

sp = [i for i in range(1001)]
n = randrange(2000)

result = binary_recursive(sp, 0, len(sp)-1, n)

if result != 'Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ':
    print(f'Число найдСно: {result}')
else:
    print('Π’Π°ΠΊΠΎΠ³ΠΎ числа Π½Π΅Ρ‚ Π² спискС')

РСшСниС 2 – ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅:

from random import randrange

def binary_iter(lst, num):
    start, end, mid = 0, len(lst) - 1, 0

    while start <= end:
        mid = (end + start) // 2
        if lst[mid] < num:
            start = mid + 1
        elif lst[mid] > num:
            end = mid - 1
        else:
            return mid
    return 'Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ'

sp = [i for i in range(1001)]
n = randrange(2000)

result = binary_iter(sp, n)

if result != 'Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ':
    print(f'Число найдСно: {result}')
else:
    print('Π’Π°ΠΊΠΎΠ³ΠΎ числа Π½Π΅Ρ‚ Π² спискС')

ПодвСдСм ΠΈΡ‚ΠΎΠ³ΠΈ

Π Π΅ΠΊΡƒΡ€ΡΠΈΡŽ стоит ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ дрСвовидная структура Π΄Π°Π½Π½Ρ‹Ρ….
  • НуТно ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ поискС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π°).
  • Π“Π»ΡƒΠ±ΠΈΠ½Π° рСкурсивных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² находится Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠ³ΠΎ ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ стСка.

Π’ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях цСлСсообразнСС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ Π»ΠΈΠ±ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈ стСк.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка ΠΈ замыкания.

***

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ самоучитСля

  1. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ, сфСры примСнСния, установка, ΠΎΠ½Π»Π°ΠΉΠ½ IDE
  2. ВсС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для изучСния Python с нуля – ΠΊΠ½ΠΈΠ³ΠΈ, сайты, ΠΊΠ°Π½Π°Π»Ρ‹ ΠΈ курсы
  3. Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…: ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
  4. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками
  5. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со списками ΠΈ списковыми Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ
  6. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со словарями ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ словарСй
  7. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°ΠΌΠΈ
  8. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со мноТСствами
  9. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ†ΠΈΠΊΠ»Π° for
  10. Условный Ρ†ΠΈΠΊΠ» while
  11. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ
  12. АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  13. РСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  14. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, замыкания ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹
  15. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой
  16. РСгулярныС выраТСния
  17. ΠžΡΠ½ΠΎΠ²Ρ‹ скрапинга ΠΈ парсинга
  18. ΠžΡΠ½ΠΎΠ²Ρ‹ ООП: инкапсуляция ΠΈ наслСдованиС
  19. ΠžΡΠ½ΠΎΠ²Ρ‹ ООП – абстракция ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ
  20. ГрафичСский интСрфСйс Π½Π° Tkinter
  21. ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ³Ρ€ Π½Π° Pygame
  22. ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с SQLite
  23. ΠžΡΠ½ΠΎΠ²Ρ‹ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Flask
  24. ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с NumPy
  25. ΠžΡΠ½ΠΎΠ²Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… с Pandas
***
🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
28 июня 2018

3 самых Π²Π°ΠΆΠ½Ρ‹Ρ… сфСры примСнСния Python: возмоТности языка

БущСствуСт мноТСство областСй примСнСния Python, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ особСнно...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...