英文:
Recursion seems to iterate one last time how can I fix this code?
问题
以下是您提供的Python代码的翻译部分:
我正在尝试检查字符串是否是回文(正反都相同)
我有困扰,不明白为什么输出会抛出错误,错误信息说在标记为已赋值的代码之后,变量未被分配。我有一个基本情况和一个递归情况。
我还需要只使用一个返回语句。
def is_palindrome(s)
if len(s) <= 1: # 如果已经到达字符串的末尾
print("是回文")
palindrome = True
print("将回文设置为True")
elif len(s) > 1:
print("长度不为1,再次检查")
if s[0] == s[-1]:
print("最左边等于最右边")
newstring = s[1:]
newstring = newstring[:-1]
s = newstring
is_palindrome(s)
else:
print("不是回文")
palindrome = False
return palindrome
输出:
长度不为1,再次检查
最左边等于最右边
长度不为1,再次检查
最左边等于最右边
长度不为1,再次检查
最左边等于最右边
是回文
将回文设置为True
错误:
Traceback (most recent call last):
line 16, in <module>
print(is_palindrome(s))
line 134, in is_palindrome
is_palindrome(s)
line 134, in is_palindrome
is_palindrome(s)
line 139, in is_palindrome
return palindrome
UnboundLocalError: local variable 'palindrome' referenced before assignment
编辑:
现在我有这段代码,但似乎无论如何都返回True
palindrome = True
#基本情况
if len(s) > 1:
print("长度不为1,再次检查")
if s[0] == s[-1]:
print("最左边等于最右边")
newstring = s[1:]
newstring = newstring[:-1]
s = newstring
is_palindrome(s)
else:
print("不是回文")
palindrome = False
return palindrome
输出:
长度不为1,再次检查
最左边等于最右边
长度不为1,再次检查
最左边等于最右边
长度不为1,再次检查
不是回文
True
英文:
I am attempting to check if a string is a palindrome or not( reads the same forwards and backwards )
I am having trouble understanding why the output is throwing the error that the variable has not been assigned after the code that says it has been assigned. I have a base case and a recursive case.
I also need to use only one return.
def is_palindrome(s)
if len(s)<=1: # if we have reached the end of the string
print("is palindrome")
palindrome = True
print("set palindrome to true")
elif len(s)>1:
print("length not 1, checking again")
if s[0] == s[-1]:
print("leftmost = rightmost")
newstring = s[1:]
newstring = newstring[:-1]
s = newstring
is_palindrome(s)
else:
print("not palindrome")
palindrome = False
return palindrome
Output:
length not 1, checking again
leftmost = rightmost
length not 1, checking again
leftmost = rightmost
length not 1, checking again
leftmost = rightmost
is palindrome
set palindrome to true
Error:
Traceback (most recent call last):
line 16, in <module>
print(is_palindrome(s))
line 134, in is_palindrome
is_palindrome(s)
line 134, in is_palindrome
is_palindrome(s)
line 139, in is_palindrome
return palindrome UnboundLocalError: local variable 'palindrome' referenced before assignment
EDIT:
I now have this code however it seems as though it is returning true regardless
CODE:
palindrome = True
#BASE CASE
if len(s)>1:
print("length not 1, checking again")
if s[0] == s[-1]:
print("leftmost = rightmost")
newstring = s[1:]
newstring = newstring[:-1]
s = newstring
is_palindrome(s)
else:
print("not palindrome")
palindrome = False
return palindrome
OUTPUT:
length not 1, checking again
leftmost = rightmost
length not 1, checking again
leftmost = rightmost
length not 1, checking again
not palindrome
True
答案1
得分: 2
问题在于你假设palindrome
变量在整个递归过程中保持不变,但实际上它在每次递归开始时都是不同的数据片段。所以如果你只关注第一层递归:
def is_palindrome(s):
if len(s) <= 1: # 如果我们已经到达字符串的末尾
# print("is palindrome")
# palindrome = True
# print("set palindrome to true")
elif len(s) > 1:
print("length not 1, checking again")
if s[0] == s[-1]:
print("leftmost = rightmost")
newstring = s[1:]
newstring = newstring[:-1]
s = newstring
is_palindrome(s)
# else:
# print("not palindrome")
# palindrome = False
return palindrome
你会得到这个结果。我已经注释掉了那些在第一层递归中不运行的部分,正如你所看到的,palindrome
从未被设置。为了实现你想要的效果,我会将这一行:
if s[0] == s[-1]:
print("leftmost = rightmost")
newstring = s[1:]
newstring = newstring[:-1]
s = newstring
is_palindrome(s)
写成这样:
if s[0] == s[-1]:
print("leftmost = rightmost")
newstring = s[1:]
newstring = newstring[:-1]
s = newstring
palindrome = is_palindrome(s)
英文:
The issue is that you're assuming the palindrome
variable is carried throughout the recursion, but it is a different piece of data each time recursion starts. So if you only follow the very first layer:
def is_palindrome(s)
if len(s)<=1: # if we have reached the end of the string
# print("is palindrome")
# palindrome = True
# print("set palindrome to true")
elif len(s)>1:
print("length not 1, checking again")
if s[0] == s[-1]:
print("leftmost = rightmost")
newstring = s[1:]
newstring = newstring[:-1]
s = newstring
is_palindrome(s)
# else:
# print("not palindrome")
# palindrome = False
return palindrome
you get this. I commented out everything that doesn't run on the first layer, as you can see palindrome
is never set. To accomplish what you want, I would take the line:
if s[0] == s[-1]:
print("leftmost = rightmost")
newstring = s[1:]
newstring = newstring[:-1]
s = newstring
is_palindrome(s)
and write it like this:
if s[0] == s[-1]:
print("leftmost = rightmost")
newstring = s[1:]
newstring = newstring[:-1]
s = newstring
palindrome = is_palindrome(s)
答案2
得分: 0
以下是已翻译好的部分:
关键问题在于这行代码:
is_palindrome(s)
你知道 is_palindrome()
返回一个值,但你忽略了它。你忽略的返回值是解决问题的关键。这里是问题的简化逻辑:
def is_palindrome(s):
palindrome = False # 假设不是回文
if len(s) <= 1: # 我们已经到达最小字符串
palindrome = True # 它是回文
elif s[0] == s[-1]: # 如果最左边等于最右边
palindrome = is_palindrome(s[1:-1]) # 递归处理“内部”字符串
return palindrome
if is_palindrome("9609457639843489367549069"):
print("是回文")
由于这段代码不处理大小写、空格和标点符号,对于语言回文来说并不像对数字回文那么有用。
英文:
A key problem is this line:
is_palindrome(s)
You know is_palindrome()
returns a value, but you've ignored it. That returned value you ignored is key to solving the problem. Here's a simplified logic for the problem:
def is_palindrome(s):
palindrome = False # assume not a palindrome
if len(s) <= 1: # we have reached a minimal string
palindrome = True # it's palindrome
elif s[0] == s[-1]: # if leftmost == rightmost
palindrome = is_palindrome(s[1:-1]) # recurse on "inner" string
return palindrome
if is_palindrome("9609457639843489367549069"):
print("is palindrome")
Since this code doesn't handle case, white space and punctuation, it's not as useful for language palindromes as it is for things like numeric palindromes.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论