【Python——算法思维】

1.Warm up

100门挑战

# 100 Doors

doors = [False] * 101

# Let's do just one pass
for i in range(1, 101):
    doors[i] = not doors[i]  # Using `not` to invert the Boolean value.

# Time for a nested for loop

# for x in range(1, 6):
#     for y in range(1, 4):
#         print("x:", x, "y:", y)

# Detour - steps in for loop
for i in range(1, 11, 2):
    print(i)

返回的结果是:
1
3
5
7
9

doors = [False] * 101  # So we can start at door no. 1 We will ignore index 0.

for i in range(1, 101):
    for j in range(i, 101, i):
        doors[j] = not doors[j]

for i in range(1, 101):
    if doors[i] is True:
        print(i, end=", ")

返回的结果是:
1, 4, 9, 16, 25, 36, 49, 64, 81, 100,

doors = [False] * 11  # So we can start at door 1. We will ignore index 0

for i in range(1, 11):
    # For the second pass, i = 2, so we start at door 2, for the 3rd pass we start at door 3 etc.
    for j in range(i, 11, i):
        print(f"i: {i}; j:{j}; step size: {i}. Toggling door number {j}.")
        doors[j] = not doors[j]  # Using `not` to invert the Boolean value

# Print out just the positions of the open doors
print("Algorithm has finished.")
for i in range(1, 11):
    if doors[i] is True:  # Or just if doors[i]:
        print(f"Door number {i} remains open.")

返回的结果是:
i: 9; j:9; step size: 9. Toggling door number 9.
i: 10; j:10; step size: 10. Toggling door number 10.
Algorithm has finished.
Door number 1 remains open.
Door number 4 remains open.
Door number 9 remains open.

FizzBuzz挑战

在这里插入图片描述

在这里插入图片描述

为了测试一个数字是否可以被另一个数字整除,我们使用模块化运算符modular operator来查看运算结果是否为零。

print(10 % 3)

返回的结果是1,因为10除以3余1。

print(9 % 3)

返回的结果是0,因为9能够被3整除。

for i in range(1,101):
    if i % 3 == 0:
        print("fizz")
    elif i % 5 == 0:
        print("buzz")
    elif i % 3 == 0 and i % 5 == 0:
        print("fizzbuzz")
    else:
        print(i)

i 的范围是1到101,这将我们从1带到100,因为范围函数的上限总是比它到达的最后一个数字高一个。并记住双等于进行比较。如果所有都不行,那就返回i所代表的数字。
然鹅,到了15的时候,只有fizz。(应该返回“fizzbuzz”)
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizz
16
17 …(省略)
因此,请考虑一下出了什么问题,现在让我们看看正确的方案。在自行检查fizz或buzz之前,需要先检查fizzbuzz,因为它要求两个条件同时为真。
正确的代码:

for i in range(1, 21):
    if i % 3 == 0 and i % 5 == 0:
        print("fizzbuzz")
    elif i % 3 == 0:
        print("fizz")
    elif i % 5 == 0:
        print("buzz")
    else:
        print(i)

所以,这是一个实例,我们需要在深入研究和实现算法之前仔细考虑我们的算法。

2. Tools to understand the flow of Algorithms

算法跟踪可视化工具

算法跟踪可视化工具
在这里插入图片描述

随着我们的代码行前进,你可以在右侧看到变量的图片。现在,全局框架(global frame)意味着变量可用于整个程序,而不是局部函数变量。所以你可以在这里看到,x指向一个列表(list),其中包含整数1、2和3。当我们继续完成我们的程序时,图片会扩展以展示所有正在发挥作用的价值。
在这里插入图片描述
如果我们把刚才写错的fizz-buzz的代码放进去,会看到数字15经过第一个筛选fizz的条件,能满足第一个条件,所以直接输出为fizz。

伪代码

事实上, 通常情况下,算法越复杂,推迟编写其实现和实际代码,而是以不同的方式对其进行推理的好处就越大。执行次操作的一个工具是伪代码。
因此,伪代码的要点是,它是一种传达算法的方式,该算法简单,清晰,明确且与语言无关。自从Python作为一种贬称该语言出现以来,对伪代码的需求有所减少,因为Python已经满足了这些标准的前三个。至于第四种,Python语法非常清晰,以至于使用它编写的算法的意图通常是显而易见的。在实践中,人们经常使用一种Python-light作为伪代码。这避免了Python的一些更高级的功能和特性,并以其他背景的程序员已于理解的而方式传达算法。下面市一个名为SelectionSort的算法示例,该算法以Python-light风格的伪代码表示。现在花点时间研究这个算法,看看你是否能理解它试图表达什么。
在这里插入图片描述
因此,我们刚刚看到的关于这种特定风格的伪代码的一些要点是,对于注释,我们使用“//”而不是"#"。我们使用do这个词只是为了引入一个块(相当于python语言的“:”)。
SelectionSort(A[0…,n-1]0)这里是一个function header,它显示参数,在这种情况下,它是一个数组或列表,索引范围从0到n-1。除了Python-light地伪代码之外,还有一些其他风格值得熟悉。有些非常接近Python-light,有些更类似于C风格的语言。所以我们有相同的算法SelectionSort,用一种更像C的风格表达。在这里插入图片描述
所以在这个例子中,我们使用大括号“{}”来描述代码块。 使用向后箭头进行赋值,省略真正C语言的一些分号。随着您进一步研究算法,您可能会遇到各种风格的伪代码。

白板

推理算法的一个非常有用的工具是白板。删除标记并替换标记是对于跟踪值特别有用,因为他们在整个算法执行过程中发生变化。此外,您可以随心所欲地凌乱,因为这纯粹是为了您自己的理解,使用任何缩写,并涂鸦。理解算法的过程往往是混乱的,通常只有在探索和发现的过程之后,才会出现正确和简化的算法。

3. Brute Force Algorithms

蛮力算法-介绍

你被要求使用python找到所有偶数,直到100。

 for i in range(1, 101):
     if i % 2 == 0:
         print(i)

也可以是这样

for i in range(2, 101, 2):
    print(i)

蛮力算法-选择排序

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值