问题的表述如下:
编写一个递归函数,给定一个字符串,检查字符串是否由彼此相等的两半组成(即s = s1 + s2,s1 = s2),强加等式运算符==的约束只能应用到长度≤1的字符串.如果字符串的长度为奇数,则返回错误.
我在Python 2.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"
Run Code Online (Sandbox Code Playgroud)
如果字符串像"abbaabba"那样预期结果为True,或者当它与其他模式("wordword")不相似时为False
这是一个非常简化的递归版本,它实际上使用单个char比较来减少问题大小:
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:])
Run Code Online (Sandbox Code Playgroud)
必须要说的是,在算法上,考虑到约束,这个问题不适合递归方法.