python递归算法_[python]请问如何实现递归算法?

可能因为我把代码贴上来所以大家觉得内容太长就懒得看了。

其实我想问的是很单纯的问题,就是如何递归实现分割字符串,我把问题简化一下吧。

有一个字符串

A1B3C2D2E

想通过递归的方法依次把这个字符串分割为

'A','B3C2D2E' #通过1分割后的结果

'A','B3C','D','E' #通过2分割后的结果

'A','B','C','D','E' #通过3分割后的结果

======下面是问题简化前的内容,如果嫌太长可以忽略========

有一个自己写的函数cutPro(),它可以实现split分割字符串的功能,split之后的字符串变成列表,列表中的每个元素又再调用cutPro(),直到不需要分割为止。

ーーーーーーーーーーーーーーーーーー

比如有字符串'A {[[B]|[C] [D] [E [F]]] G H|I}'

先分割为A和[[B]|[C] [D] [E [F]]] G H|I

再把[[B]|[C] [D] [E [F]]] G H|I分割为[[B]|[C] [D] [E [F]]] G H和I

如此这般分割到没有括号为止。

ーーーーーーーーーーーーーーーーーー

自己写了3个函数:

cutPoint():决定split的位置

rplStr():给需要split的位置做标记

cutPro():根据cutPoint()提供的位置来split字符串

ーーーーーーーーーーーーーーーーーー

这3个函数的关系如下:

def cutPro():

cutPoint()

rplStr()

ーーーーーーーーーーーーーーーーーー

下面是详细代码,现在这个代码只能分割第一层,输出结果如下:

['A', '{[[B]|[C] [D] [E [F]]] G H|I}']

如果觉得内容太长不看代码也恳请给一个思路或简单例子!请各位大神帮帮忙救救我!

#决定split的位置

def cutPoint(str_n):

verticalLine = {} #竖线的所在层级和位置

space = {} #括号+空格的所在层级和位置

hierarchy = 1 #初始层级为1

cut_v = '' #确定split竖线的位置

cut_s = '' #确定split空格的位置

for n in range(len(str_n)):

try:

#有左括号时,层级+1

if (str_n[n] == "[") | (str_n[n] == "{"):

hierarchy += 1

#有右括号时,层级-1

if (str_n[n] == "]") | (str_n[n] == "}"):

hierarchy -= 1

#有竖线时,记录竖线所在位置和所在层级

if str_n[n] == '|':

if verticalLine.setdefault(hierarchy,[n]) != [n]:

verticalLine[hierarchy].append(n)

#有括号+空格时,记录空格所在位置和所在层级

if (str_n[n] == ' ' and str_n[n + 1] == '[') or (str_n[n] == ' ' and str_n[n + 1] == '{'):

if space.setdefault(hierarchy, [n]) != [n]:

space[hierarchy].append(n)

if (str_n[n] == ']' and str_n[n + 1] == ' ') or (str_n[n] == '}' and str_n[n + 1] == ' '):

if space.setdefault(hierarchy, [n + 1]) != [n + 1]:

#如果已经记录了位置就不再重复记录

if n + 1 not in space[hierarchy]:

space[hierarchy].append(n + 1)

except:

n_err = True

n += 1

#只获取第1层级的竖线和括号+空格的位置

if 1 in verticalLine:

cut_v = verticalLine[1]

if 1 in space:

cut_s = space[1]

return cut_v,cut_s

#给需要split的位置做标记

def rplStr(text,list,replacement=''):

for i in range(len(list)):

text = '%s%s%s'%(text[:list[i]],replacement,text[list[i]+1:])

return text

def cutPro(strLst):

#决定split的位置

#cut_v:竖线的位置

#cut_s:括号+空格的位置

cut_v,cut_s = cutPoint(strLst)

#有竖线的时候按照竖线的所在位置split

if cut_v != '':

strLst = rplStr(strLst,cut_v,'●')

#有括号+空格的时候按照空格的所在位置split

elif cut_s != '':

strLst = rplStr(strLst,cut_s,'●')

strLst = strLst.split('●')

return strLst

if __name__ == "__main__":

str_n = 'A { [ [ B ] | [ C ] [ D ] [ E [ F ] ] ] G H | I }'

str_n = str_n.replace('[ ','[').replace(' ]',']').replace('{ ','{').replace(' }','}').replace(' | ','|')

strLst = [str_n]

for i in range(len(strLst)):

print(cutPro(strLst[i]))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值