python使用递归思想处理问题

来源:互联网 发布:百度竞价数据分析案例 编辑:程序博客网 时间:2024/06/05 04:04
今天我们主要学习使用递归思想处理,斐波那契数列,打印文件层级结构

,汉诺塔小游戏。

递归说的稍微简点就是函数调用自身的一种方法,哪有人说,自己调用自己那不就死循环的了吗,那就需要我们自己设定结束条件,我个人认为递归思想你只要把开头和结束条件理清了思路,中间的那大部分就是一遍又一遍的调用自身。先来看一下斐波纳挈数列,我们先是用循环在使用递归思想来打印:
def fab(n):    a = 0    b = 1    while n > 0:        if a == 0 or b == 1:            print(1,end= ' ')            a, b = b, a + b            n -= 1        else:            print(b, end= ' ')            a, b = b, a + b            n -= 1   我们打印一下5以内的斐波纳挈数列:   fab(10)   G:\python\python.exe G:/Pyproject/day115/test3.py1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 Process finished with exit code 0

我们在使用递归思想打印斐波纳挈数列:

def fab(n):    if n == 2 or n == 1:        return 1    else:         return fab(n - 1) + fab(n - 2)for i in range(1, 21):    print(fab(i), end= ' ')我们打印二十以内的斐波纳挈数列G:\python\python.exe G:/Pyproject/day115/test3.py1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 Process finished with exit code 0

接下来我们使用递归思想来实现打印 文件目录结构层级的打印,我们还是先用循环来解决问题:

import osdef get_all(path):    temp = [path]    while len(temp):        new_path = temp.pop()        L = os.listdir(new_path)        for name in L:            new_name = os.path.join(new_path, name)            if os.path.isdir(new_name):                print('目录:', new_name)                temp.append(new_name)            else:                print('文件:', new_name)get_all(r'G:\blogworkspace\blogproject\comments')来看实现结果:G:\python\python.exe G:/Pyproject/day115/test2.py文件: G:\blogworkspace\blogproject\comments\admin.py文件: G:\blogworkspace\blogproject\comments\apps.py文件: G:\blogworkspace\blogproject\comments\forms.py目录: G:\blogworkspace\blogproject\comments\migrations文件: G:\blogworkspace\blogproject\comments\models.py文件: G:\blogworkspace\blogproject\comments\tests.py文件: G:\blogworkspace\blogproject\comments\urls.py文件: G:\blogworkspace\blogproject\comments\views.py文件: G:\blogworkspace\blogproject\comments\__init__.py目录: G:\blogworkspace\blogproject\comments\__pycache__文件: G:\blogworkspace\blogproject\comments\__pycache__\admin.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\__pycache__\forms.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\__pycache__\models.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\__pycache__\urls.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\__pycache__\views.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\__pycache__\__init__.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\migrations\0001_initial.py文件: G:\blogworkspace\blogproject\comments\migrations\__init__.py目录: G:\blogworkspace\blogproject\comments\migrations\__pycache__文件: G:\blogworkspace\blogproject\comments\migrations\__pycache__\0001_initial.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\migrations\__pycache__\__init__.cpython-36.pycProcess finished with exit code 0

接着我们使用递归来实现:

import osdef get_all(path):    L = os.listdir(path)    for name in L:        new_path = os.path.join(path, name)        if os.path.isdir(new_path):            print('目录:', new_path)            get_all(new_path)        else:            print('文件:', new_path)get_all(r'G:\blogworkspace\blogproject\comments')打印结果是:G:\python\python.exe G:/Pyproject/day115/test2.py文件: G:\blogworkspace\blogproject\comments\admin.py文件: G:\blogworkspace\blogproject\comments\apps.py文件: G:\blogworkspace\blogproject\comments\forms.py目录: G:\blogworkspace\blogproject\comments\migrations文件: G:\blogworkspace\blogproject\comments\migrations\0001_initial.py文件: G:\blogworkspace\blogproject\comments\migrations\__init__.py目录: G:\blogworkspace\blogproject\comments\migrations\__pycache__文件: G:\blogworkspace\blogproject\comments\migrations\__pycache__\0001_initial.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\migrations\__pycache__\__init__.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\models.py文件: G:\blogworkspace\blogproject\comments\tests.py文件: G:\blogworkspace\blogproject\comments\urls.py文件: G:\blogworkspace\blogproject\comments\views.py文件: G:\blogworkspace\blogproject\comments\__init__.py目录: G:\blogworkspace\blogproject\comments\__pycache__文件: G:\blogworkspace\blogproject\comments\__pycache__\admin.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\__pycache__\forms.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\__pycache__\models.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\__pycache__\urls.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\__pycache__\views.cpython-36.pyc文件: G:\blogworkspace\blogproject\comments\__pycache__\__init__.cpython-36.pycProcess finished with exit code 0

最后我们来看一下汉诺塔游戏:

def hanoi(n, x, y, z):    if n == 1:        print(x, ' --> ', z)    else:        hanoi(n-1, x, z, y) # 将前n-1个盘子从x移动到y上        print(x, ' --> ', z) # 将最底下的最后一个盘子从x移动到z上        hanoi(n-1, y, x, z) # 将y上的n-1个盘子移动到z上n = int(input('请输入汉诺塔的层数:'))hanoi(n, 'X', 'Y', 'Z')有x y z三个柱子,箭头指向表示从哪转移哪我们输入三,看一下执行结果:请输入汉诺塔的层数:3X  -->  ZX  -->  YZ  -->  YX  -->  ZY  -->  XY  -->  ZX  -->  ZProcess finished with exit code 0
原创粉丝点击