🐍 Π‘Π°ΠΌΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ 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Β»
***

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! Π’Ρ‹ поняли ΡΠ°ΠΌΡƒΡŽ ΡΡƒΡ‚ΡŒ рСкурсии.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΈ ΡƒΠΌΠ΅Π΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ рСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ случаСм, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибки RecursionError. Π£ вас Π΅ΡΡ‚ΡŒ вся нСобходимая тСория, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ.

Но Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ, β€” это лишь ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаг. Π“ΠΎΡ€Π°Π·Π΄ΠΎ Π²Π°ΠΆΠ½Π΅Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Π΅Ρ‘ стоит ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ это эффСктивно. Π’ ΠΏΠΎΠ»Π½ΠΎΠΉ вСрсии ΡƒΡ€ΠΎΠΊΠ° Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅:

  • ΠŸΠΎΡ‡Π΅ΠΌΡƒ рСкурсия ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ² (с наглядным тСстом ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ).
  • Как ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ рСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² сотни Ρ€Π°Π· с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° @lru_cache.
  • Как Ρ€Π΅ΡˆΠΈΡ‚ΡŒ 10 практичСских Π·Π°Π΄Π°Ρ‡ двумя способами β€” рСкурсивным ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° Π΄Π΅Π»Π΅ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы.

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию
Flutter Developer
ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
Lead C++ Software Engineer (Gameplay)
ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
AppSec BP
ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования

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

admin
11 дСкабря 2018

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

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

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

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

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

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