涉及递归的程序的Python问题

时间:2013-11-19 22:16:59

标签: python recursion

对于一门课程,我正在制作一个必须涉及递归的程序。这就是我到目前为止所做的:

def words(letters, start, word):
    while (start) < (len(letters)):
        word = word + letters[start]
        print(word)
        letters = letters.replace(letters[start], "")
        start = (words(letters, start, word))
        return (start + 1)

该计划的目标是接受一个字母列表并输出这些字母的所有可能组合。我不确定该程序是否可行,但在此之前,我遇到了另一个问题。当我使用基本命令运行时,例如

words("abcd", 0, "")

0""仅用于启动命令,因为它们将来是必需的)。但是,当我运行它时,它会输出一个ab abc abcd,但随后会因错误引用行返回(start + 1)而导致start不是整数,而是None type。什么时候开始成为None type?如何将其保留为整数?

2 个答案:

答案 0 :(得分:2)

如果while循环没有被entereed(在你的例子中基本上是if语句),请记住返回一些东西:

def words(letters, start=0, word=""):
    if start < len(letters):
        word = word + letters[start]
        print(word)
        letters = letters.replace(letters[start], "")
        start = words(letters, start, word)
        return start + 1
    else:
        return 0

我也设置了一些默认值,所以你现在可以这样做:

words(letters="abcd")

答案 1 :(得分:2)

当您return时,您会返回int。但是,您只能在while循环中执行此操作,即start < len(letters)时。如果不满足该条件,则您的函数不会返回任何内容,即NoneType 这就是为什么最终,在您的while循环中,start变为NoneType,这会导致您的错误。

你可以这样做:

def words(letters, soFar=''):
  if not letters:
    print(soFar)
  else:
    for i,char in enumerate(letters):
      words(letters[:i]+letters[i+1:], soFar+char)