【问题标题】:To ensure an action happens only once during a recursive call确保一个动作在递归调用期间只发生一次
【发布时间】:2015-10-02 07:42:22
【问题描述】:

我有一个过程,其中包含一个涉及递归调用过程的步骤。我希望某个动作不是第一次完成,而是在其他时候被递归调用。

def a(string):
    while string.startswith('/'):
        string =string[1:]
    stringa = string.split('/',1)

    if(len(stringa)>1):
        a(stringa)

基本上我的字符串是/a/b/c/d 类型。我想在第一次将 stringa 作为{/}{a/b/c/d} 并将连续递归作为
字符串 ={a}{b/c/d}
字符串 ={b}{c/d}
字符串 ={c}{d}

【问题讨论】:

  • 考虑将标志最初设置为 false ,但一旦存在循环就设置为 true
  • 你试过什么?您是否尝试过在递归调用之前通过打印 stringa 进行调试,并尝试让 stringa 成为您想要的格式?在 a() 的开头打印字符串也是一个好主意。递归函数调试起来可能很痛苦,如果可以的话,可以考虑使用 for 循环,也可以更容易地实现你的第一次唯一操作,因为不再有任何递归,如果你明白我的意思的话。
  • 您的代码无论如何都不起作用,因为您期望一个字符串但stringa 是一个列表。

标签: python recursion


【解决方案1】:

基本模式是使用标志。您可以将标志设置为默认参数,这样您就不必在第一次调用函数时传递它,然后函数在递归调用时设置(或取消设置...)标志。

看起来像这样:

def some_function(..., is_first=True):
    if is_first:
        # code to run the first time
    else
        # code to run the other times
    # recurse
    some_function(..., is_first=False)

我不确切知道如何将其转换为您的代码,因为不清楚您只想在第一次时做什么。另外,您首先传入一个字符串,但您的递归调用是传入一个列表。

【讨论】:

    猜你喜欢
    • 2016-01-15
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多