for循环

  • 一道有关for循环的课本上的练习题:
    输出所有由1、2、3、4这四个数字组成的素数,并且在每个素数中每个数字只使用一次。
  • 说明:此题并不难,仅仅是for循环的使用,没有涉及到算法之类的问题,之所以写在这里,是想告诉自己:再分析这种问题时,记得进行优化啊,有些步骤是可以省略的,因为可以直接走到后面的步骤;for循环减少时间复杂度的方式是,提前进行一些判断,从而使循环次数减少一些。
  • 我的思路:列出所有组合,如[1, 2, 3, 4]组成的数字,然后将这个列表放到大列表中;然后将这个大列表中的所有小列表都转换为一个int型整数,如[1, 2, 3, 4] -------> 1234;然后对所有转换好的int型整数进行判断,看其是否为素数。程序实现如下:
nums = [1,2,3,4]
temp = []
result = []
for num1 in nums:
    temp.append(num1)
    for num2 in nums:
        if num2 not in temp:
            temp.append(num2)
            for num3 in nums:
                if num3 not in temp:
                    temp.append(num3)
                    for num4 in nums:
                        if num4 not in temp:
                            temp.append(num4)  
                            #print(temp)                              
                            
                            #result.append(temp) 
                            #注意:不能直接用temp,否则后面改变temp的话,
                            #result中的内容也都会改变,这是因为python中的变量都是指针。。。
                            #最终result中的数据就都为空了!
                            t = []
                            for i in temp:
                                t.append(i)
                            result.append(t)
                                                            
                            temp.pop()
                    temp.pop()
            temp.pop()
    temp.pop()
#print(result)

# 转换成24个整数存放在nums列表中
nums = []
for num in result:
    nums.append(num[0] * 1000 + num[1] * 100 + num[2] * 10 + num[3])
print(nums)

# 从nums中找出素数存放在sushu列表中
sushu = []
import math
for num in nums:
    for i in range(2, int(math.sqrt(num))+2):
        if num % i == 0:
            break
        elif i == int(math.sqrt(num))+1 and num % i != 0:
            sushu.append(num)
print(sushu)

在这里插入图片描述
然而,容易看出,时间复杂度太高了!空间复杂度也挺高!

  • 提示:省略将大列表中的小列表转换为整数这一步骤,而是利用for循环直接得到组合出来的整数!
nums = [1,2,3,4]
result = []
for num1 in nums:
    for num2 in nums:
        for num3 in nums:
            for num4 in nums:
                if num1!=num2 and num1!=num3 and num1!=num4 and num2!=num3 and num2!=num4 and num3!=num4:
                    result.append(num1*1000 + num2*100 + num3*10 + num4)
print(result)

在这里插入图片描述
但其实时间复杂度几乎没变。

  • 提示:一些判断完全可以在外层循环来做,从而使后面的循环次数减少一些,达到提高效率的效果。
nums = [1,2,3,4]
result = []
for num1 in nums:
    for num2 in nums:
        if num2 != num1:
            for num3 in nums:
                if num3 != num1 and num3 != num2:
                    for num4 in nums:
                        if num1!=num4 and num2!=num4 and num3!=num4:
                            result.append(num1*1000 + num2*100 + num3*10 + num4)
print(result)

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值