1
s="(8+(2+4))"
def checker(n):
if len(n) == 0:
    return True
if n[0].isdigit==True:
    if n[1].isdigit==True:
        return False
    else:
        checker(n[1:])
else:
    checker(n[1:])

这就是我到目前为止所拥有的。简单的代码,试图查看一个字符串是否满足以下条件。但是,当我执行检查器时,我得到:

True
IndexError: string index out of range

有什么帮助吗?在此先感谢编辑:该函数的目的是如果字符串仅包含单个数字数字,则生成 true,如果字符串中存在 2 个或更多数字,则生成 false。

4

3 回答 3

3

当 的长度n为 0 时,该n[0]部分将引发错误,因为字符串为空。您应该在return那里添加一个语句而不是打印。

def checker(n):
    if len(n) < 2:
        return True
    if n[0] in x:

请注意,条件必须是,否则当字符串长度为 1 时len(n) < 2会出错。n[1]

其次,您尝试将字符与包含整数的列表匹配,因此in检查始终为False. 将列表项转换为字符串或更好地使用str.isdigit.

>>> '1'.isdigit()
True
>>> ')'.isdigit()
False
>>> '12'.isdigit()
True

更新:

您可以为此使用regex和:all

>>> import re
def check(strs):
    nums = re.findall(r'\d+',strs)
    return all(len(c) == 1 for c in nums)
... 
>>> s="(8+(2+4))"
>>> check(s)
True
>>> check("(8+(2+42))")
False

您的代码的工作版本:

s="(8+(2+4))"
def checker(n):
    if not n:           #better than len(n) == 0, empty string returns False in python
        return True
    if n[0].isdigit():  #str.digit is a method and it already returns a boolean value   
        if n[1].isdigit():   
            return False
        else:
            return checker(n[1:])  # use return statement for recursive calls
                                   # otherwise the recursive calls may return None  
    else:
        return checker(n[1:])        

print checker("(8+(2+4))")
print checker("(8+(2+42))")

输出:

True
False
于 2013-07-09T04:49:45.623 回答
1

你应该return True在第一个 if 语句之后做,而不是print True. 该函数在该语句之后继续运行,并在输入大小为 0 时遇到错误。

于 2013-07-09T04:49:03.880 回答
0

我无法重现您的错误。

我必须解决一些问题:

  • 缩进,我猜这只是粘贴到页面中的问题
  • .isdigit()是一个函数;调用.isdigit==True会将函数对象与 True 进行比较,这永远不会是真的。我.isdigit==True改为.isdigit()
  • 我确保返回值会冒泡 - 没有这个,递归可以完成,但最外面的函数只返回“None”。

除此之外,一些打印语句表明这是按预期工作的

s="(8+(2+4))"
t="(8+(20+4))"
def checker(n):
  print "checking %s" % n
  if len(n) == 0:
    print "Returning true"
    return True
  if n[0].isdigit():
    if n[1].isdigit():
        print "returning false"
        return False
    else:
        return checker(n[1:])
  else:
    return checker(n[1:])

print checker(s)
print checker(t)

输出:

checking (8+(2+4))
checking 8+(2+4))
checking +(2+4))
checking (2+4))
checking 2+4))
checking +4))
checking 4))
checking ))
checking )
checking 
Returning true
True
checking (8+(20+4))
checking 8+(20+4))
checking +(20+4))
checking (20+4))
checking 20+4))
returning false
False
于 2013-07-09T06:04:48.093 回答