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

时间:2014-11-13 23:10:48

标签: 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
        palindromeMethod(theWord)
    else:
        return False

palindromeMethod(aWord)

我在三个num处收到错误,其中包含:unresolved reference 'num',我在运行时收到错误local variable 'num' referenced before assignment。但是我在方法之前定义了num,为什么我会收到这些错误?感谢

编辑:自己回答

4 个答案:

答案 0 :(得分:2)

函数内部的变量具有局部范围,因此您需要在函数内部初始化num!但是,由于此处有递归函数,因此无法在函数中指定num=0

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

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

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

答案 1 :(得分:2)

在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移到了函数外部并修复了一些错误。

答案 2 :(得分:2)

无需索引或长度

def pal(w):
    if w == "": return True
    if w[0] != w[-1]: return False
    return pal(w[1:-1])

但您可能已被要求使用它们......

修改

根据OP的评论,这有效地缩小了可能的响应范围,这里是一个外观,没有切片版本。

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可能希望删除它们,因为它们未被请求(NB:w / o {{ 1}}等等5 LOC(。)

测试输出

print

最后的烟花:非常期待的单线

012345678
aabbcbbaa
0 8 a a
1 7 a a
2 6 b b
3 5 b b
Is the word "aabbcbbaa" palindrome? True.
0123456789
aabbccbbaa
0 9 a a
1 8 a a
2 7 b b
3 6 b b
4 5 c c
Is the word "aabbccbbaa" palindrome? True.
012345678
aabbccbaa
0 8 a a
1 7 a a
2 6 b b
3 5 b c
Is the word "aabbccbaa" palindrome? False.
0123456789
aabbcdbbaa
0 9 a a
1 8 a a
2 7 b b
3 6 b b
4 5 c d
Is the word "aabbcdbbaa" palindrome? False.
0123456789012345678
saippuakivikauppias
0 18 s s
1 17 a a
2 16 i i
3 15 p p
4 14 p p
5 13 u u
6 12 a a
7 11 k k
8 10 i i
Is the word "saippuakivikauppias" palindrome? True.

答案 3 :(得分:0)

好吧我玩了它并想出了这个,没有任何错误:

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%肯定为什么这样做。当我说“返回真实”时,我猜测到了这一点。它突破了外部的if块,并且没有执行if块中的下两行(num = num + 1和palindromeMethod(theWord,num)....这是正确的吗?