Python学习笔记之汉诺塔游戏

一、系列缘由

  作为一名运维工程师,也一直有一个学习开发的想法,值此之际,不知道博客的下一期目标在哪里,在这思考和犹豫的间隙想着学习和充实一下自己,学习一下python语言,python随着大数据和人工智能的兴起而日益火爆。边学习边实践的原则学习python,希望自己更上一层楼。我的目标是创建一个自己的网站——太阳站点(sun-site.com),一个自娱自乐的自由空间。

二、学习笔记

1、函数的定义和规则

  函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数,函数规则如下:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号 : 起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。

def 函数名(参数列表):
  函数体

2、函数参数

  • 必需参数
    必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样,你必须传入一个参数,不然会出现语法错误:

def printme( str ):

  • 关键字参数
    关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

printme(str=“hello”)

  • 默认参数
    调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:

def printinfo( name, age = 35 ):

  • 不定长参数
    你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。基本语法如下:

def functionname([formal_args,] *var_args_tuple ):

  • 关键字参数的**运算
    加了两个星号 ** 的参数会以字典的形式导入。

def printinfo( arg1, **vardict ):
调用的时候需要使用关键字参数形式
printinfo(1, a=2,b=3)

3、递归函数

函数调用是指函数定义完成后,在函数外可以被别的语句执行。在特殊情况下我们在定义中的语句执行函数本身,这就是递归函数。递归函数我们需要指定结束递归的判定条件。

4、匿名函数

python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

lambda 函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,…argn]]:expression

三、实践练习

1、游戏代码

(base) [root@s186 python]# cat hnt.py 
#!/root/anaconda3/bin/python
# This is a python program.
'''
这是一个汉诺塔游戏,一共有三根金刚石柱子
A柱子上有N个黄金圆盘,需要全部移动到C柱子
小盘只能放到大盘上面,一次只能移动一个圆盘
'''
count=0

def move(n,a,b,c):
        global count
        if (n == 1):
                print(a,"柱->最上层圆盘移动到->",c,"柱")
                count+=1
                return
        move(n-1,a,c,b) #把n-1个圆盘从a移动到b
        move(1,a,b,c)   #把最后一个圆盘从a移动c
        move(n-1,b,a,c) #把n-1个圆盘从b移动到c

x=int(input('您想玩几层汉诺塔?请如下对应数字:'))
move(x,'a','b','c')
print("一共需要执行",count,"步才可以移动完成!")

2、设计思路

  • 定义一个全局变量用于记录需要移动的步数
  • 使用人类推理的逻辑分解移动方案:
    首先需要将(n-1)个盘子移动到B柱
    然后将最大圆盘从A柱移动到C柱
    然后将(n-1个盘子从B柱移动到C柱)
  • 记录n=1的时候的移动步骤
  • 打印总共需要移动盘子的次数。
    在这里插入图片描述

3、游戏测试

在这里插入图片描述

おすすめ

転載: blog.csdn.net/carefree2005/article/details/121164593