鱼C论坛

 找回密码
 立即注册
查看: 2649|回复: 7

是否双层for循环在内层循环中无法改变同一函数定义了的初值?

[复制链接]
发表于 2020-3-1 23:01:18 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 DF4B6266 于 2020-3-2 08:53 编辑

如题,我在写“输出100之内的素数”时发现了一个问题。我把布尔值has_num定义在双层for循环外,初值为False;利用两层for循环迭代100以内的所有数是否可被整除,如果可被整除说明不是素数,则对has_num赋值True;每结束内层循环一次就判断has_num的真假,若仍为False则代表该数为素数,加入result列表。但是这样的话无法返回正确结果,而把上述内容中“如果可被整除说明不是素数,则对has_num赋值True”改为“如果可被整除说明不是素数,则把该数加入result列表”,并且利用set函数去重后会发现能输出正确的素数列表。我很疑惑,是不是循环嵌套时也会产生变量作用域的问题?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-1 23:02:29 | 显示全部楼层
输出错误结果的代码如下:
has_num = False
        result = []
        for num in range(1, 100):
            for div in range(2, num):
                if num % div == 0:
                    has_num = True
            if not has_num:
                result.append(num)
        print(result)
最终输出结果:
[1, 2, 3]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-1 23:02:51 From FishC Mobile | 显示全部楼层
不贴代码,说再多也是浮云
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-1 23:04:03 | 显示全部楼层
输出非素数列表的结果如下:
        result = []
        for num in range(1, 100):
            for div in range(2, num):
                if num % div == 0:
                   result.append(num)
        result  = set(result)
        print(result)
最终输出结果:
{4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 38, 39, 40, 42, 44, 45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 60, 62, 63, 64, 65, 66, 68, 69, 70, 72, 74, 75, 76, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 96, 98, 99}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-1 23:08:14 From FishC Mobile | 显示全部楼层
DF4B6266 发表于 2020-3-1 23:04
输出非素数列表的结果如下:
        result = []
        for num in range(1, 100):

发现是合数就改变那个神马num
同时退出本轮循环,下次循环时要初始化那个神马num
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-1 23:41:03 | 显示全部楼层
本帖最后由 jackz007 于 2020-3-1 23:47 编辑

        问题出在,内层循环开始之前,都必须初始化 has_num,而不是只在程序开头初始化一次就完事。
  1. import math
  2. result = []
  3. for num in range(2 , 100):
  4.     has_num = True              # 假定 num 是素数
  5.     for div in range(2 , int(math . sqrt(num)) + 1):
  6.         if div < num and not (num % div):
  7.             has_num = False     # 否定 num 是素数的假定
  8.             break               # 不用继续循环
  9.     if has_num:
  10.         result . append(num)
  11. print('%2d' % result[0] , end = '')
  12. for k in range(1 , len(result)):
  13.         print('\t%2d' % result[k] , end = '')
  14. print()
复制代码

        运行实况:
  1. C:\Bin>python x.py
  2. 2       3       5       7      11      13      17      19      23      29
  3. 31      37      41      43      47      53      59      61      67      71
  4. 73      79      83      89      97

  5. C:\Bin>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-2 08:52:15 | 显示全部楼层
jackz007 发表于 2020-3-1 23:41
问题出在,内层循环开始之前,都必须初始化 has_num,而不是只在程序开头初始化一次就完事。

   ...

好的,明白了,谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-2 08:52:56 | 显示全部楼层
wp231957 发表于 2020-3-1 23:08
发现是合数就改变那个神马num
同时退出本轮循环,下次循环时要初始化那个神马num

好的,明白了,谢谢啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 15:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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