鱼C论坛

 找回密码
 立即注册
查看: 2567|回复: 5

代码报错请指点

[复制链接]
发表于 2017-8-26 21:25:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def EightQueen(chess,n):
   if n==8:
      print(chess)
   else:
      for i in range(8):
        chess[n]=i
        for j in range(0,i):
            if(chess[j]==chess[i] or (chess[j]-chess[i]==j-i) or (chess[j]-chess[i]==i-j)):
                flag = False
                break
            else:
                flag = True
        if flag:
           EightQueen(chess,n+1)
EightQueen([None]*8,0)

上面的代码运行时提示:
Traceback (most recent call last):
  File "C:\Users\lich\Desktop\python\N皇后问题\递归\N皇后.py", line 15, in <module>
    EightQueen([None]*8,0)
  File "C:\Users\lich\Desktop\python\N皇后问题\递归\N皇后.py", line 13, in EightQueen
    if flag:
UnboundLocalError: local variable 'flag' referenced before assignment

Python版本为3.6.2,提示flag在分配前被引用,这个是为什么啊?我明明在前面已经对flag赋值了,为什么还是说分配前被引用呢?

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-26 21:59:28 | 显示全部楼层
  1. def EightQueen(chess,n):
  2.    global flag
  3.    if n==8:
  4.       print(chess)
  5.    else:
  6.       for i in range(8):
  7.         chess[n]=i
  8.         for j in range(0,i):
  9.             if(chess[j]==chess[i] or (chess[j]-chess[i]==j-i) or (chess[j]-chess[i]==i-j)):
  10.                 flag = False
  11.                 break
  12.             else:
  13.                 flag = True
  14.         if flag:
  15.            EightQueen(chess,n+1)
  16. EightQueen([None]*8,0)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-26 22:09:16 | 显示全部楼层
本帖最后由 chunchun2017 于 2017-8-26 22:12 编辑


刚仔细分析了一下,发现for i in range(8)循环体第一次运行的时候,for j in range(0,i)是不会被运行的,因为此时i=0,这时就会跳过下面的flag=Flase和flag=True的定义,直接运行if flag:EightQueen(chess,n+1),此时会需要判断flag的值,所以就会提示flag在分配前被引用了,
只需要在for j in range(0,i)前增加flag的赋值就可以了
  1. #chess为棋盘上棋子组成的一维数组
  2. #n为递归次数
  3. #N为皇后个数
  4. def NQueen(chess,n,N):
  5.    count = 0
  6.    if n==N:
  7.       print(chess)
  8.    else:
  9.       for i in range(N):
  10.         chess[n]=i
  11.         flag = True
  12.         for j in range(0,n):
  13.             if(chess[j]==chess[n] or (chess[j]-chess[n])==(n-j) or (chess[j]-chess[n])==(j-n)):
  14.                 flag = False
  15.                 break
  16.             else:
  17.                 flag = True
  18.         if flag:
  19.            NQueen(chess,n+1,N)
  20. NQueen([0]*4,0,4)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-26 22:16:44 | 显示全部楼层
chunchun2017 发表于 2017-8-26 22:09
刚仔细分析了一下,发现for i in range(8)循环体第一次运行的时候,for j in range(0,i)是不会被运行的 ...

你在逗我玩,,
前面没有赋值flag?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-26 22:29:31 | 显示全部楼层
本帖最后由 chunchun2017 于 2017-8-26 22:31 编辑
新手·ing 发表于 2017-8-26 22:16
你在逗我玩,,
前面没有赋值flag?


哪里敢逗大神,我把所有的代码都贴出来了,前面没有赋值,就是在for 里面赋的值,我刚开始以为在For里面if和else的情况都赋值了,就不会有问题了,原谅我是新手...
后来我才发现这个问题,请大神原谅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-27 09:21:23 | 显示全部楼层
chunchun2017 发表于 2017-8-26 22:29
哪里敢逗大神,我把所有的代码都贴出来了,前面没有赋值,就是在for 里面赋的值,我刚开始以为在For里面 ...

我是萌新
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 22:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表