python中的递归函数不会调用自身

python中的递归函数不会调用自身,python,python-2.7,Python,Python 2.7,问题的表述如下: 编写一个递归函数,给定一个字符串,该函数检查字符串 由彼此相等的两部分组成(即s=s1+s2,带s1 =s2),强制要求等式运算符==只能应用于长度为的字符串≤1.如果字符串的长度为 奇数,返回一个错误 我用Python2.7编写了这段代码,它是正确的(每次都给我正确的答案),但根本没有进入递归循环。所以我可以省略这个电话吗 def recursiveHalfString(s): #@param s: string #@return bool if (len(s))%2==

问题的表述如下:

编写一个递归函数,给定一个字符串,该函数检查字符串 由彼此相等的两部分组成(即s=s1+s2,带s1 =s2),强制要求等式运算符==只能应用于长度为的字符串≤1.如果字符串的长度为 奇数,返回一个错误

我用Python2.7编写了这段代码,它是正确的(每次都给我正确的答案),但根本没有进入递归循环。所以我可以省略这个电话吗

def recursiveHalfString(s):
#@param s: string
#@return bool

 if (len(s))%2==0:     #verify if the rest of the division by 2 = 0 (even number)

  if len(s)<=1:        # case in which I can use the == operator
   if s[0]==s[1]:
    return True
   else:
    return False

  if len(s)>1:                           
   if s[0:len(s)/2] != s[len(s)/2:len(s)]:     # here I used != instead of ==
    if s!=0:
     return False
    else:
     return recursiveHalfString(s[0:(len(s)/2)-1]+s[(len(s)/2)+1:len(s)])    # broken call    
   return True

 else:
   return "Error: odd string"
def recursivehalf字符串:
#@参数s:字符串
#@返回布尔
如果(len(s))%2==0:#验证除以2的其余部分是否为0(偶数)
如果镜头1:
如果s[0:len(s)/2]!=s[len(s)/2:len(s)]:#我用过这里!=而不是==
如果是的话=0:
返回错误
其他:
返回递归半字符串(s[0:(len(s)/2)-1]+s[(len(s)/2)+1:len(s)])#中断调用
返回真值
其他:
返回“错误:奇数字符串”

如果字符串类似于“abbaabba”,则预期结果为真
或者当它与其他模式(“wordword”)不相似时为False这是一个非常简化的递归版本,实际上使用单字符比较来减少问题大小:

def rhs(s):
    half, rest = divmod(len(s), 2)
    if rest:  # odd length
        raise ValueError  # return 'error'
    if half == 0:  # simplest base case: empty string
        return True
    return s[0] == s[half] and rhs(s[1:half] + s[half+1:])

必须指出的是,在算法上,考虑到约束条件,这个问题不适合递归方法。

这里是另一个递归解决方案。当采用递归方法时,一个好的经验法则是首先考虑基本情况

此函数将字符串分成两半,比较前几个字符,并递归调用自身,将两半串接在一起而不使用前导字符


然而,正如在另一个答案中所述,在这种情况下,递归不一定是有效的解决方案。这种方法会创建大量新字符串,而且绝不是实现这一点的最佳方法。它仅用于演示。

另一个不涉及创建一组新字符串的递归解决方案可能如下所示:

def recursiveHalfString(s, offset=0):
    half, odd = divmod(len(s), 2)
    assert(not odd)
    if not s or offset > half:
        return True
    if s[offset] != s[half + offset]:
        return False
    return recursiveHalfString(s, offset + 1)
然而,正如@Schwobasegll所建议的那样,这里的递归方法比简单的迭代方法更笨拙:

def recursiveHalfString(s, offset=0):
    half, odd = divmod(len(s), 2)
    assert(not odd)
    for offset in range(half):
        if s[offset] != s[half + offset]:
            return False
    return True

如果
==
是字符串长度>1的禁区,我会假设
=也是不允许的。它本质上是
而不是==
。使用
=操作符显然违背了任务的精神——如果是s,您可以在任何地方使用
==
而不是
x==y
=0:
始终为真,因为
s
是字符串。所以你永远不能在else部分结束。而且,
s
是一个字符串。它永远不会等于
0
0
不是字符串。
'abcabc'
是受约束对称的还是所有嵌套的半字符串本身都必须对称?
def recursiveHalfString(s, offset=0):
    half, odd = divmod(len(s), 2)
    assert(not odd)
    for offset in range(half):
        if s[offset] != s[half + offset]:
            return False
    return True