Python语言学习(二)(函数和递归函数)

函数

  • 函数是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字,之后即可通过函数名执行。

  • 定义函数:def 函数名(形式参数1,…,形式参数n):(换行缩进)语句块。

  • 调用函数:函数名(实际参数1,…,实际参数n)。

  • 缺省参数是指在定义形参时进行赋值,调用时如果未给出实参值,就是用缺省参数值。

  • 有返回值的函数,用return进行返回最终值。函数遇到return语句就会终止当前函数的执行,return之后的语句都会被忽略。

  • 局部变量只能在特定部分使用,全局变量整个程序都能使用。

  • 如果局部变量与全局变量名称相同,在局部变量作用的范围内是局部变量在起作用。

  • 如果想在函数内部对全局变量进行修改,需要使用global关键字。

  • 函数优点:代码可重用,提高开发效率;代码更简洁,可读性好;编程更容易把握;封装和信息隐藏。

  • 使用函数进行程序设计,被称为结构化程序设计方法。

  • 函数练习:给定年和月份,获得当月第一天是周几(从1800年1月1号开始计算,当天是周三),代码如下:

def is_leap_year(year):
    if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
        return True
    else:
        return False

def get_num_of_days_in_month(year, month):
    if month in (1, 3, 5, 7, 8, 10, 12):
        return 31
    elif month in (4, 6, 9, 11):
        return 30
    elif is_leap_year(year):
        return 29
    else:
        return 28

def get_total_num_of_day(year, month):
    days = 0
    for y in range(1800, year):
        if is_leap_year(y):
            days += 366
        else:
            days += 365
    for m in range(1, month):
        days += get_num_of_days_in_month(year, m)

    return days

def get_start_day(year, month):
    return (3 + get_total_num_of_day(year, month)) % 7

print(get_start_day(2033, 12))

递归函数

  • 递归表现形式:在函数定义时有直接或者间接调用自身。
  • 递归解决问题的基本思想:if问题足够简单则直接求解,else将问题分解成与原问题同构的一个或多个更小的问题逐个解决,将结果组合成为最终解返回。
  • 汉诺塔问题解决思想:1、将前n-1个盘子通过c,从a移动到b;2、从a到c移动第n个盘子;3、将前n-1个盘子通过a,从b移动到c。定义函数hanoi(n,a,b,c)表示把a上的n个盘子移动到c上,其中可以遇到b,代码如下:
count = 0

def hanoi(n, a, b, c):
    global count
    if n == 1:
        print('Move', n, 'from', a, 'to', c)
        count += 1
    else:
        hanoi(n - 1, a, c, b)
        print('Move', n, 'from', a, 'to', c)
        count += 1
        hanoi(n - 1, b, a, c)
        print('')

hanoi(3, 'left', 'mid', 'right')
print('steps is', count)
  • 递归方法的时间开销是比较大的,一般要比循环的方式慢得多。
  • 递归优势:能使一个蕴含递归关系且结构复杂的程序简洁精炼,增加可读性;特别是在难于找到从边界到解的全过程的情况下,如果把问题推进一步,其结果仍维持原问题的关系。
  • 递归劣势:嵌套层次深,函数调用开销大;重复计算。

猜你喜欢

转载自blog.csdn.net/CSDNTianJi/article/details/89213468
今日推荐