尝试学习递归时得到奇怪的结果

2024-10-03 23:23:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着做一个codewar测试,需要输入一串文本,然后将驼峰案例分解,并将它们分成一个单词列表,我希望结果是

['break', 'Camel', 'Case', 'Ez']

但我不知道我的代码的哪一部分导致了这个问题

word_list = []
def solution(s):
    global word_list
    if any([char.isupper() for char in s][1:]):
        # print([char.isupper() for char in s][1:])
        for i, char in enumerate(s):
            if i == 0:
                continue
            if char.isupper():
                word_list.append(s[:i])
                solution(s[i:])
    else:
        word_list.append(s)

    return word_list
# print("breakCamelCaseEz")
print(solution("breakCamelCaseEz"))

我得到的结果是

['break', 'Camel', 'Case', 'Ez', 'CamelCase', 'Ez', 'breakCamel', 'Case', 'Ez', 'breakCamelCase', 'Ez']

也 当我试图在函数中添加一个计数器来查找问题时,我遇到了更多的问题

word_list = []
indexing = 0
def solution(s):
    global word_list, indexing
    indexing += 1
    if any([char.isupper() for char in s][1:]):
        print([char.isupper() for char in s][1:])
        # break it down
        for i, char in enumerate(s):
            if i == 0:
                continue
            if char.isupper():
                word_list.append(s[:i])
                print("{}-{}".format("loop", indexing))
                solution(s[i:])
    else:
        print("{}-{}-{}".format("else", indexing, s))
        word_list.append(s)

    return word_list
# print("breakCamelCaseEz")
print(solution("breakCamelCaseEz"))

我已经把代码读了好几遍了,但还是弄不明白

*编辑的第一部分


Tags: inforiflistwordcaseprintsolution
2条回答
def break_camel(string):
    output = []
    currword =[]
    for c in string:
        if c.islower():
            currword.append(c)
        else:
            output.append( ''.join(currword))
            currword = []
    return output

我也能做到

import re

def solution(word):
    return list(filter(None, re.split('([A-Z][a-z]*)', word)))

print(solution("breakCamelCaseEz"))

输出:

['break', 'Camel', 'Case', 'Ez']

我使用filter从列表中删除空值,然后使用filter对象上的list将其转换回列表

相关问题 更多 >