代码之家  ›  专栏  ›  技术社区  ›  Furkan Ryuka

python递归我不理解这个输出,请帮帮我

  •  0
  • Furkan Ryuka  · 技术社区  · 2 年前
    def azalt(s):
        if len(s)< 1:
            return s
        else:
            print('özyinelemesürecine girerken:', s)
            azalt(s[1:])
            print('özyinelemesürecinden çıkarken:', s)
    
    azalt('12345')
    

    输出

    özyinelemesürecine girerken: 12345
    özyinelemesürecine girerken: 2345
    özyinelemesürecine girerken: 345
    özyinelemesürecine girerken: 45
    özyinelemesürecine girerken: 5 #(***)
    özyinelemesürecinden çıkarken: 5 
    özyinelemesürecinden çıkarken: 45
    özyinelemesürecinden çıkarken: 345
    özyinelemesürecinden çıkarken: 2345
    özyinelemesürecinden çıkarken: 12345
    

    之后我不懂代码 #(***) (我强调)

    我希望输出是这样的

    输出

    özyinelemesürecine girerken: 12345
    özyinelemesürecine girerken: 2345
    özyinelemesürecine girerken: 345
    özyinelemesürecine girerken: 45
    özyinelemesürecine girerken: 5
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Andrej Kesely    2 年前

    为了更好地理解,您可以向函数添加另一个参数(让我们调用它 level= )当您递归调用该函数时,它将增加1:

    def azalt(s, level):
        if len(s) < 1:
            return s
        else:
            print("the string before:", s, f"{level=}")
            azalt(s[1:], level + 1)
            print("the string after:", s, f"{level=}")
    
    
    azalt("12345", level=1)
    

    现在的结果是:

    the string before: 12345 level=1
    the string before: 2345 level=2
    the string before: 345 level=3
    the string before: 45 level=4
    the string before: 5 level=5
    the string after: 5 level=5
    the string after: 45 level=4
    the string after: 345 level=3
    the string after: 2345 level=2
    the string after: 12345 level=1
    

    你看到那一秒了 print() (有 after )从递归函数返回时执行。

        2
  •  0
  •   tashaffi samin    2 年前

    如果您不熟悉递归调用堆栈,我鼓励您深入研究它,以充分理解print语句。基本上,每次 azalt 被递归调用时,它会保留最近执行的行,并直接进入下一个调用。当下一个调用返回时,它会立即执行后面的行(请记住,它知道要执行哪一行,因为它保留在堆栈中)。当执行完所有接下来的步骤后,它将返回。

    调用1:azalt(12345)[打印12345,下一个调用,堆栈上的当前调用]

    调用2:azalt(2345)[打印2345,下一个调用,堆栈上的当前调用]

    调用3:azalt(345)[打印345,下一个调用,堆栈上的当前调用]

    调用4:azalt(45)[打印45,下一个调用,堆栈上的当前调用]

    调用5:azalt(5)[打印5,下一个调用,堆栈上的当前调用]

    调用6:azalt(空)[返回并从调用堆栈中移除]

    调用5:azalt(5)[现在打印5,返回并从调用堆栈中移除]

    调用4:azalt(45)[现在打印45,返回并从调用堆栈中移除]

    调用3:azalt(345)[现在打印345,返回并从调用堆栈中移除]

    调用2:azalt(2345)[现在打印2345,返回并从调用堆栈中移除]

    调用1:azalt(12345)[现在打印12345,返回并从调用堆栈中删除]

    希望这能有所帮助!