Python算法入门4~7

1.有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

解题思路:其实如果算个数,就很简单,以排列组合位解题突破口,但是居然要输出?听到也是很是吓了一跳?感觉要遍历?啊这?

小编也是个不懂要问的人,问了老师居然说组成的三位数不重复而且不能出现重复数字如:111、112等,着实又吓了一跳?

于是我拿起了手中的笔,一波操作终于明白老师葫芦里装的啥了!

 

那不就是三维交点吗?而不重复就是去掉某些点?感觉这个图说不清楚啊!

瞬间直观不受,也就是首先点在[1,4]区间上的空间点,无重复就是去掉面对交线和体对交线的点吧!啊这?这就是买的药?原来如此,也太嗨理解了吧!

上代码!记住一维一个for,而为用两个for,三维就套三次!

    else:
        # 传统循环嵌套
        for i in num_list:
            for j in num_list:
                for k in num_list:
                    if i != j and i != k and j != k:
                    	# 最终结果保存为列表,每种组合用元组保存
                        result_list.append((i,j,k))
                        # 最终组合个数,也可以使用len()
                        count_num += 1

这代码太多了吧!给你装逼!

#使用itertools工具后,循环嵌套层数明显减少,代码量减少2行
from itertools import product
for i, j, k in product(num_list,repeat=3):
    if i != j and i != k and j != k:
    	# 最终结果保存为列表,每种组合用元组保存
        result_list.append((i,j,k))
        # 最终组合个数,也可以使用len()
        count_num += 1

啥?有人还闲多?你咋这么能?

result_lst = [(i,j,k) for i, j, k in product(num_list,repeat=3) if i != j and i != k and j != k]

5.输出100以内的素数

import math #导入math库,以便使用里面的一个求平方根的函数
l = [2, 3] #因为range函数上限不能小于下线,所以2,3预先加到素数列表中,直接从5开始(因为知道4不是素数)循环
for i in range(5, 101): #第一层循环,从5到100
    for j in range(2, int(math.sqrt(i))+1): #第二层循环,逐个判断是否有因子
        if i%j == 0: #如果出现整除说明有因子
            break #跳出循环判断下一个
    else: #如果第二层循环结束还没有跳出的话
        l.append(i) #说明是素数,加到列表里
print(" ".join(map(str, l))) #先将列表中的元素变为字符串再用空格连接输出

 6.输入一个数,判断是不是素数

n = int(input("请输入一个正整数n:"))
if n < 2:           #判断是否大于1的整数,且1不是素数
    print("%d不是素数!"%n)
else:
    for i in range(2,n):
        if n % i == 0:    #判断2——i是否有能被整除
            print("%d不是素数!"%n)
            break
    else:
        print("%d是素数!"%n)

7.输出出斐波那契数列的前n项

n=int(input('输出斐波拉契数列的前n项:n='))
list=[]
for m in range(0,n):
    if m==0:
        list.append(0)
    elif m==1:
        list.append(1)
    else:
        list.append(list[m-1]+list[m-2])
for i in range(len(list)):
    print(list[i],end=' ')

忍不住装个B

a,b = 0 , 1
while b<200:
    print(b),
    a,b = b,a+b

讲解思路

起源

兔子问题:“假定一对大兔子每月能生一对小兔子,且每对新生的小兔子经过一个月可以长成一对大兔子,具备繁殖能力,如果不发生死亡,且每次均生下一雌一雄,问一年后共有多少对兔子?”

分析:第一个月兔子没有繁殖能力,所以还是一对;两个月后生下一对兔子,共有两对;三个月后,老兔子生下一对,小兔子还没有繁殖能力,所以一共是三对,以此类推,可以列出下表

表中1,1,2,3,5,8,13.....构成一个序列,这个数列有一个特点就是前两项之和等于后一项

数学函数定义:

 

1 青蛙跳台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。

提示:f(n) = f(n-1) + f(n-2)

应用:

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶......也可以跳上n级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。

提示:f(n) = 2n-1

2 如果我们用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问8个2*1的小矩形无重叠地覆盖一个2*8的大矩形,总共有多少种方法?

提示:f(8) = f(7) + f(6)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优价实习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值