在python中使用无循环递归拆分字符串

在python中使用无循环递归拆分字符串,python,string,python-3.x,recursion,tuples,Python,String,Python 3.x,Recursion,Tuples,所以我试图解决这个问题,它要求我拆分一个字符串并返回一个拆分字符串的元组,这应该通过递归完成,绝对不使用循环。 这是我设法想出的函数: def split_path(s): tup=[] i=s.find("/") if i!=-1: tup.append(s[0:i]) new_str=s[i+1:] tup.append(split_path(new_str)) else: tup.appe

所以我试图解决这个问题,它要求我拆分一个字符串并返回一个拆分字符串的元组,这应该通过递归完成,绝对不使用循环。 这是我设法想出的函数:

def split_path(s):
    tup=[]

    i=s.find("/")
    if i!=-1:
        tup.append(s[0:i])
        new_str=s[i+1:]
        tup.append(split_path(new_str))


    else:
        tup.append(s)
    return tup
“E:/cp104/2005/labs/lab11t4”是我输入函数的字符串,输出应该是:

['E:', 'cp104','2005','labs','lab11t4']
但这就是我所拥有的:

['E:', ['cp104', ['2005', ['labs', ['lab11t4']]]]]
现在我成功地得到了字符串中我需要的所有值,我知道问题是我返回了一个元组,所以它只是在元组中附加了一个元组,所以我的外部元组中只有2个元素


那么,如何准确地将内部元素解耦,从而使最终的元组为一维而不是我拥有的5维元组呢?

在执行递归时,更改
追加
扩展
。因为您返回了一个列表,所以您希望扩展当前的列表,而不是附加另一个内部列表

def split_path(s):
    tup=[]
    i=s.find("/")
    if i!=-1:
        tup.append(s[0:i])
        new_str=s[i+1:]
        tup.extend(split_path(new_str))
    else:
        tup.append(s)
    return tup

split_path("E:/cp104/2005/labs/lab11t4")
['E:', 'cp104', '2005', 'labs', 'lab11t4']

执行递归时,将
append
更改为
extend
。因为您返回了一个列表,所以您希望扩展当前的列表,而不是附加另一个内部列表

def split_path(s):
    tup=[]
    i=s.find("/")
    if i!=-1:
        tup.append(s[0:i])
        new_str=s[i+1:]
        tup.extend(split_path(new_str))
    else:
        tup.append(s)
    return tup

split_path("E:/cp104/2005/labs/lab11t4")
['E:', 'cp104', '2005', 'labs', 'lab11t4']

您可以使用
extend
而不是
append

tup.extend(split_path(new_str))

您可以使用
extend
而不是
append

tup.extend(split_path(new_str))

对于给定程序的最小修复,现有答案是正确的。然而,给定的程序不是很好的递归形式。像这样在内存中显式地构建结果是一种更加迭代的习惯用法

下面是另一个版本,它更像是递归样式:

def split_rec(path):
    i = path.find('/')
    if i == -1:
        return (path,)
    else:
        return (path[:i],) + split_rec(path[i+1:])

这还会返回一个实际的元组,如问题文本中的元组,而不是代码中的列表。要使它返回一个列表,请将
(something,)
替换为
[something]
。对于给定程序的最小修复,现有答案是正确的。然而,给定的程序不是很好的递归形式。像这样在内存中显式地构建结果是一种更加迭代的习惯用法

下面是另一个版本,它更像是递归样式:

def split_rec(path):
    i = path.find('/')
    if i == -1:
        return (path,)
    else:
        return (path[:i],) + split_rec(path[i+1:])

这还会返回一个实际的元组,如问题文本中的元组,而不是代码中的列表。要使其返回一个列表,请将出现的两次
(something,)
替换为
[something]

对于python来说,这是一个多么糟糕的作业……对于python来说,这是一个多么糟糕的作业……您的算法建立了一个延迟操作链,这是一个递归过程,也是一个递归过程。其他的是迭代过程,但它们仍然是递归过程。您的算法建立了一个延迟操作链,这是一个递归过程,也是一个递归过程。其他的是迭代过程,但它们仍然是递归过程