python 3中递归方法和全局变量的问题

python 3中递归方法和全局变量的问题,python,if-statement,recursion,Python,If Statement,Recursion,代码如下: aWord = input("enter the word now") num = 0 def palindromeMethod(theWord): length = len(theWord) if(theWord[num]==theWord[length-num]): if(num>length): print("its a palindrome") num = num+1 palind

代码如下:

aWord = input("enter the word now")
num = 0

def palindromeMethod(theWord):
    length = len(theWord)
    if(theWord[num]==theWord[length-num]):
        if(num>length):
            print("its a palindrome")
        num = num+1
        palindromeMethod(theWord)
    else:
        return False

palindromeMethod(aWord)
我在三个
num
s处得到错误,它们表示:
未解析的引用'num'
,当我运行它时,我在赋值之前得到引用的错误
局部变量'num'。但是我在方法之前定义了
num
,为什么会出现这些错误?谢谢


编辑:自己回答

函数中的变量具有局部作用域,因此需要在函数中初始化
num
!但是由于这里有一个递归函数,所以不能在函数中指定
num=0

所以我对这个问题的建议是:

  • 将num作为参数传递给函数:


函数中的变量具有局部作用域,因此需要在函数中初始化
num
!但是由于这里有一个递归函数,所以不能在函数中指定
num=0

所以我对这个问题的建议是:

  • 将num作为参数传递给函数:


在python中,为了跟踪递归过程中需要存在的变量,可以使用带有默认值的参数

def palindromeMethod(theWord, num=0):
                       # here ^
    length = len(theWord)
    if(theWord[num]==theWord[length-num-1]):
        if(num>=length-1):
            return True
        return palindromeMethod(theWord, num+1)
                          # pass it here ^
    else:
        return False

if palindromeMethod('aabbccbbaa'):
   # don't need to pass it here ^
    print('its a palindrome')

我将
print
移到函数外部,并修复了一些一个一个的错误。

在python中,为了跟踪递归过程中需要存在的变量,您使用了一个带有默认值的参数

def palindromeMethod(theWord, num=0):
                       # here ^
    length = len(theWord)
    if(theWord[num]==theWord[length-num-1]):
        if(num>=length-1):
            return True
        return palindromeMethod(theWord, num+1)
                          # pass it here ^
    else:
        return False

if palindromeMethod('aabbccbbaa'):
   # don't need to pass it here ^
    print('its a palindrome')

我将
打印
移到函数外部,并修复了一些一个一个的错误。

好的,我对它进行了处理,并提出了一个无错误的方法:

aWord = input("enter the word now")
num = 0

def palindromeMethod(theWord, num):
    length = len(theWord)


    if(theWord[num]==theWord[length-(1+num)]):
        if(num>=length-1):
            print("its a palindrome")
            return True
        num = num+1
        palindromeMethod(theWord,num)
    else:
        return False

palindromeMethod(aWord,0)

然而,我不是100%确定这为什么有效。我猜当我说“return True”时,它脱离了外部的if块,不执行if块中的下两行(num=num+1和palindromeMethod(the word,num)…这是正确的吗?

好的,我用它玩了一下,想出了一个没有错误的方法:

aWord = input("enter the word now")
num = 0

def palindromeMethod(theWord, num):
    length = len(theWord)


    if(theWord[num]==theWord[length-(1+num)]):
        if(num>=length-1):
            print("its a palindrome")
            return True
        num = num+1
        palindromeMethod(theWord,num)
    else:
        return False

palindromeMethod(aWord,0)

然而,我不能100%确定这是为什么。我猜当我说“return True”时,它脱离了外部if块,不执行if块中的下两行(num=num+1和palindromeMethod(theWord,num)……这是正确的吗?

不需要索引或长度

def pal(w):
    if w == "": return True
    if w[0] != w[-1]: return False
    return pal(w[1:-1])
但是你可能被要求使用它们

编辑 在OP的评论之后,这有效地缩小了可能的反应范围,这里是上面的look-ma,no-slices版本

def pal(w, l=0, n=0):

    # in production use: l = l if l else len(w)
    if l ==0:
        l = len(w)
        print(("0123456789"*3)[:l])
        print(w)

    print(n, l-n-1, w[n], w[l-n-1])
    if w[n] != w[l-n-1]: return False
    if n+1 >= l-n-2: return True
    return pal(w,l,n+1)

# a bit of testing
for word in ('aabbcbbaa', 'aabbccbbaa', 'aabbccbaa', 'aabbcdbbaa',
             'saippuakivikauppias'):
    print('Is the word "%s" palindrome? %s.' % (word, pal(word)))
print
表达式用于显示函数正在进行的工作,OP可能希望删除它们,因为它们未被请求(注意:w/o
print
s等,其位置为5 LOC)

测试输出

最后的焰火:备受期待的一艘客轮
不需要索引或长度

def pal(w):
    if w == "": return True
    if w[0] != w[-1]: return False
    return pal(w[1:-1])
但是你可能被要求使用它们

编辑 在OP的评论之后,这有效地缩小了可能的反应范围,这里是上面的look-ma,no-slices版本

def pal(w, l=0, n=0):

    # in production use: l = l if l else len(w)
    if l ==0:
        l = len(w)
        print(("0123456789"*3)[:l])
        print(w)

    print(n, l-n-1, w[n], w[l-n-1])
    if w[n] != w[l-n-1]: return False
    if n+1 >= l-n-2: return True
    return pal(w,l,n+1)

# a bit of testing
for word in ('aabbcbbaa', 'aabbccbbaa', 'aabbccbaa', 'aabbcdbbaa',
             'saippuakivikauppias'):
    print('Is the word "%s" palindrome? %s.' % (word, pal(word)))
print
表达式用于显示函数正在进行的工作,OP可能希望删除它们,因为它们未被请求(注意:w/o
print
s等,其位置为5 LOC)

测试输出

最后的焰火:备受期待的一艘客轮
为什么在if语句周围有paren?除了
n
问题外,您至少还有两个其他问题(1)在每次调用函数时,您都在计算单词的长度……它保持不变(2)你开始比较第一个字符和最后一个字符,然后继续比较最后一个字符和第一个字符……这不是有点重复吗?@gboffi这个练习的目的是要做到不含糊。尽管如此,上面的要点现在仍然是正确的,就像你晚了一点之前一样,但仍然欢迎澄清。@Padraiccningham«为什么在if语句周围有paren?为什么有camelCaseVariables?为什么不能使用slice?我的猜测是,OP是使用Python引入Java的,因为Python易于使用,而不是过度语法化(?)学习工具…为什么你的if语句有paren?除了
n
问题外,你至少还有两个其他问题(1)你在每次调用函数时都要计算单词的长度…它保持不变(2)你开始比较第一个字符和最后一个字符,然后继续比较最后一个字符和第一个字符……这不是有点重复吗?@gboffi这个练习的目的是要做到不含糊。尽管如此,上面的要点现在仍然是正确的,就像你晚了一点之前一样,但仍然欢迎澄清。@Padraiccningham«为什么在if语句周围有paren?为什么有camelCaseVariables?为什么不能使用slice?我的猜测是,OP是使用Python引入Java的,因为Python易于使用,而不是过度语法化(?)学习工具…UTC 01:25我认为
if I>length:
中的变量
I
,只是
num
的一个输入错误。但是,然后你以与之前相同的状态递归调用
palindromeMethod
!StackOverflow…谁对你的答案投了赞成票?@gboffi,因为OP的问题和问题都是关于
局部变量的赋值前引用的num
我只是回答这个问题!如果他告诉我其他问题,那么我尝试为!Kasra改进这些问题,(1)如果
word[0]==word[-1]
您的代码将以无限递归的方式螺旋上升,事实就是事实就是事实(2)让我们关注一下
n
:正确答案是羊皮纸的,不是你的!你在每次调用函数时都设置了
n=0
!这个用例只使用默认值来解决,因为递归算法需要在递归调用之前改变状态(好吧,不使用默认值,您可以强制用户在用户程序的第一次调用中显式提供默认值,但这有点愚蠢)。我在这条注释中没有更多字符,ciao@gboffi