Python递归树结构,回溯法深度优先、广度优先详解,代码实现

简介: Python递归树结构,回溯法深度优先、广度优先详解,代码实现

Python实现,递归算法,深度优先、广度优先


其实递归说白了就是循环本身函数,只不过下次循环的输入值是上次循环的结果值。关于递归算法,我经常把它用在搜索、计算中。我们来看一个简单的例子:


计算Demo


'要实现1,3,7,15,31''有如下数列,请问第7位是多少 --> 127 '
#普通写法
def simple(time):
    '''如上可以看出规则为 1 * 2 + 1 ''' '''此时如果硬写代码会比较繁琐,'''
    time -= 1
    for i in range(time):
        if i == 0:
            factor = (0 * 2 + 1)
        val = factor * 2 + 1
        factor = val
    return factor
print(f'硬写:{simple(7)}')
#递归算法
def loop(time, n=1, factor=0):
    val = factor * 2 + 1
    if n == time:
        return val
    return loop(time, n + 1, val)
print(f'递归:{loop(7)}')

1684141674586.jpg


从上述代码中可以看到,用递归计算真的是非常方便了。虽然是个很简单的例子,但是也可以看出来递归算法节省了很多代码并且逻辑也是非常清晰。对于我们Python来讲,简洁、明了的代码才是最好的代码,所以力荐!!!


搜索Demo(深度优先、广度优先)


关于递归算法, 上面的例子以及充分展示了,不再多说。下面讲一下在递归中经常用到的搜索方法。

深度优先:

广度优先:

'''搜索'''
lis= [('文件1','文件5','文件8','文件21'),
      ('文件12','文件4','文件2','文件34'),
      ('文件18','文件10','文件9','文件16')]
'''这里以搜索文件举例,如上有三层:深度优先搜索指的是由 0.0->0.1->0.2 -> 1.0->1.1->1.2
                           #广度优先搜索指的是由 0.0->1.0->2.0 -> 0.1->1.1->2.1'''


无论都是通过遍历而来,只不过遍历的时候给出了方向而已。

看一个简单的例子

'''搜索'''
lis = [('文件1', '文件5', '文件8', '文件21'),
       ('文件12', '文件4', '文件2', '文件34'),
       ('文件18', '文件10', '文件9', '文件16')]
# 假如我们要找'文件2'
# 深度优先:    文件1->文件5
frequency = 0
for tup_index in range(len(lis)):  # 得到lis总长度,通过索引遍历
    for k in range(len(lis[tup_index])):
        frequency += 1
        if lis[tup_index][k] == '文件2':
            print(f'找到了,位置是{tup_index, k},共查找{frequency}次')
# 广度优先:   文件1->文件12
import numpy as np
frequency = 0
lis = np.transpose(lis)  # 转置一下
'''
[['文件1' '文件12' '文件18']
 ['文件5' '文件4' '文件10']
 ['文件8' '文件2' '文件9']]'''
for tup_index in range(len(lis)):  # 得到lis总长度,通过索引遍历
    for k in range(len(lis[tup_index])):
        frequency += 1
        if lis[tup_index][k] == '文件2':
            '''因为我们转置了,所以得出来的位置 2,1 需要对调为 1,2'''
            print(f'找到了,位置是{k, tup_index},共查找{frequency}次')

1684141732412.jpg


这两种方法视实际情况而用,无所谓好坏。也可以结合使用。如下:

[('文件1','文件5','文件8','文件21'),
      ('文件12','文件4','文件2','文件34'),
      ('文件18','文件10','文件9','文件16')]
问:请找到'文件2'!
已知: '文件2' 在 '文件12' 之后且'文件12'在第一层。
答:可以先利用广度优先找到'文件12',需2步,找到之后再用深度优先往下找,需2步,总共4步找到 '文件2'。


好啦,到此递归算法的使用也就差不多啦。

相关文章
|
1月前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
49 6
|
2月前
|
存储 缓存 测试技术
Python中的装饰器:功能增强与代码复用的利器
在Python编程中,装饰器是一种强大而灵活的工具,它允许开发者以简洁优雅的方式增强函数或方法的功能。本文将深入探讨装饰器的定义、工作原理、应用场景以及如何自定义装饰器。通过实例演示,我们将展示装饰器如何在不修改原有代码的基础上添加新的行为,从而提高代码的可读性、可维护性和复用性。此外,我们还将讨论装饰器在实际应用中的一些最佳实践和潜在陷阱。
|
23天前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
62 33
|
24天前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
44 10
|
2月前
|
人工智能 数据挖掘 Python
Python编程基础:从零开始的代码旅程
【10月更文挑战第41天】在这篇文章中,我们将一起探索Python编程的世界。无论你是编程新手还是希望复习基础知识,本文都将是你的理想之选。我们将从最基础的语法讲起,逐步深入到更复杂的主题。文章将通过实例和练习,让你在实践中学习和理解Python编程。让我们一起开启这段代码之旅吧!
|
1月前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
86 8
|
1月前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
64 11
|
1月前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
50 11
|
1月前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
1月前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
63 6

热门文章

最新文章