【发布时间】:2021-06-24 18:38:18
【问题描述】:
我有这个练习:
编写一个递归函数,接受一个字符串并返回该字符串中不重复的所有字符。
输出中的字符不需要与输入字符串中的顺序相同。
首先我尝试了这个,但考虑到函数停止的条件,它永远不会计算最后一个字符:
i=0
lst = []
def list_of_letters_rec(str=""):
if str[i] not in lst and i < len(str) - 1:
lst.append(str[i])
list_of_letters_rec(str[i+1:])
elif str[i] in lst and i < len(str) - 1:
list_of_letters_rec(str[i+1:])
elif i > len(str) - 1:
return lst
return lst
word = input(str("Word?"))
print(list_of_letters_rec(word))
这个函数的主要问题是它从不计算最后一个字符。 输出示例:
['a', 'r', 'd', 'v'] 用于输入“土豚”。
由于不需要对字符进行排序,我想更好的方法是向后递归,我还尝试了另一种方法(如下),但没有运气:
lst = []
def list_of_letters_rec(str=""):
n = len(str) - 1
if str[n] not in lst and n >= 0:
lst.append(str[n])
list_of_letters_rec(str[:n-1])
elif str[n] in lst and n >= 0:
list_of_letters_rec(str[:n-1])
return lst
word = input(str("Word?"))
print(list_of_letters_rec(word))
显然,停止条件没有很好地定义,尤其是在最后一个,因为我得到的输出是
IndexError: 字符串索引超出范围
您能否给我任何提示以帮助我在第 1st 或 2nd 尝试中更正停止条件?
【问题讨论】:
-
您的代码引用了未定义的变量
lst和lista... -
@trincot 谢谢!我不是以英语为母语的人,因此代码与最初的方式有点“适应”。已经更正了那一点。
-
您不应为变量赋予与常用内置函数相同的名称,即不应调用您的字符串
str。 -
您使用的逻辑存在错误,但您在第二个版本中输入超出范围的原因是因为您在检查
n>=0之前调用了str[n]。如果您只是交换这两个语句,程序将运行(尽管输出仍然不正确)。 -
为什么在这种情况下引用函数外部的变量,即
lst。使函数过于复杂,通常是不好的形式。
标签: python string list recursion