【问题标题】:Getting weird result when try to learn recursion [duplicate]尝试学习递归时得到奇怪的结果[重复]
【发布时间】:2021-03-17 08:47:05
【问题描述】:

我正在尝试做一个代码战测验,它需要输入一串文本,分解骆驼大小写,并将它们分成一个单词列表,我期待结果是

['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"))

我已经多次阅读代码,但仍然无法弄清楚

*编辑第一部分

【问题讨论】:

  • 请解释您希望理想结果是什么以及它与您的问题中显示的结果有何不同
  • “我正在尝试做一个代码战测验”- 你能说说这个问题到底是什么吗?
  • 每次你看到一个大写字母时你都在递归(除了开头)。所以solution("fooBarBaz") 会调用solution("BarBaz")solution("Baz")solution("BarBaz") 也会调用solution("Baz")。所以solution("Baz") 被调用了两次,Baz 两次出现在列表中。此外,在solution("fooBarBaz") 调用solution("Baz") 之前,它会将"fooBar" 添加到列表中,这是错误的,因为那是两个词。据我所知,递归在这里没有任何用处,只会混淆事物。您应该尝试仅使用循环来实现。
  • 即使你要得到一个递归解决方案,你也不应该使用全局变量,而是最好返回word_list.extend(solution(s[i:]))的结果

标签: python


【解决方案1】:

也可以解决问题

import re

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

print(solution("breakCamelCaseEz"))

输出:

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

我使用过滤器从列表中删除空值,然后使用过滤器对象上的列表将其转换回列表。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多