【递归可以干什么】1#重复执行某种模式

简介: 【递归可以干什么】1#重复执行某种模式

递归程序设计是计算机算法设计的重要组成部分,是衡量程序设计水平的关键指标。递归程序应用十分广泛,如数据结构中树、图、快速排序等核心算法。然而,递归程序的学习并非易事,要求较高的抽象思维和逻辑思维,即便是拥有多年开发经验的资深工程师,依然会“谈归色变”。


介绍递归的博客众多,然而初学者在阅读后,依然不知所措,复杂的概念、复杂的递归树、复杂的思想,让大家望而却步,亟需新的思路来重新梳理递归的本质。


本系列博客将介绍递归的方方面面有趣的知识点和案例,由浅入深,试图从各个视角来深入理解递归,最终实现活运用递归解决实际问题。


问题

所谓递归,指的就是某函数foo不停的调用自身,直到满足某条件后结束调用自己,如下:


def foo():
  if condition is true:
    return 
  do some interesting things
  foo()


不难发现,foo()函数一直在不停的在调用自己,而每一次调用自己,[do some interesting things] 这块代码都会被执行一次,因此,递归可以理解为重复的在执行一段有趣的代码,递归调用了n次,则这段有趣代码就被执行了n次。


如果单就这一点来看,递归的功能与循环结构十分类似,如下是循环结构的一般模式:

for i in range(n):
  do some interesting things

基于上述认识,可以利用递归来实现循环结构能够做的一些事情。


方法

利用递归实现100次打印字符串’hello’,即print(‘hello’)的代码需要重复执行100次。利用递归的重复执行[do some interesting things]特性,可以实现该功能,关键点在于如何精确的控制递归执行的次数。


定义变量n,每调用一次自身就减少1,这样即可实现控制递归执行的次数,代码如下:

def foo(n):
    if n == 0:
        return
    print('hello')
    foo(n-1)
if __name__ == '__main__':
    foo(100)

结语

本节介绍了递归的重复执行代码块的特性,并通过精确控制递归调用的次数,实现了一种重复打印字符串的效果。是不是觉得很有趣呢?当深入理解递归后,并充分利用其特性,可以实现一些十分有趣的功能。


递归,还有太多的细节值得我们去发掘,如果您对递归感兴趣,欢迎持续关注后续递归算法系列博客。


目录
相关文章
|
7月前
|
机器学习/深度学习 Python
获取重复的文件
使用 Python 3.10+ 的程序找出图片样本中的重复文件,依赖包 `NStudyPy`。通过计算文件的 MD5 值来识别重复项。核心函数 `get_repeat_file` 接受路径和递归选项,返回一个字典,键为 MD5,值为相同 MD5 的文件列表。`get_file_list` 和 `get_md5` 函数留待后续解释。安装 `NStudyPy`:`pip install -U NStudyPy`。
55 2
|
8月前
|
算法 程序员 C++
C++程序中的循环语句:实现重复执行的关键
C++程序中的循环语句:实现重复执行的关键
448 2
|
8月前
|
消息中间件 监控 Go
合并队列的例子
【5月更文挑战第14天】文中探讨了如何跨线程或机器合并两个有序任务队列, 利用队列有序性优化合并效率。任务队列用于工作单元调度,通过消息代理在客户端和工作进程间通信,实现高可用和可扩展系统。队列功能包括监控、调度、工作流程、资源保护、时间和速率限制以及组件定制。合并操作的时间复杂度在最好情况下为O(N),最坏情况为O(N²),其中N为较短队列的长度。
257 0
合并队列的例子
|
8月前
|
Java 大数据 数据处理
获取到数据循环写文件
这段代码是一个Java方法,用于分批处理数据。它定义了初始值和每批处理的数量,然后通过`PageInfo`对象获取数据。如果总数小于1,则直接返回空列表。否则,循环处理数据,防止环境中的多次空跳过,并在处理完一批数据后更新页码。代码中还提到,这个过程可以用于减少大数据操作带来的风险。此外,配有一张动图,可能表示数据处理的过程。
54 1
|
设计模式 消息中间件 JavaScript
干掉 “重复代码”,这三种方式绝了!
干掉 “重复代码”,这三种方式绝了!
36981 2
干掉 “重复代码”,这三种方式绝了!
|
存储 Java 测试技术
打印不重复的字符串全排列(递归)
本文将详细解析在生成不重复的字符串全排列时使用的Java代码。首先,我们将展示一个常规的全排列生成方法,然后介绍如何通过使用HashSet来跳过已经尝试过的字符,从而避免生成重复的全排列。最后,我们提供了一道相关的编程题目以供练习。
131 0
打印不重复的字符串全排列(递归)
C#基础⑤——三大结构(顺序、分支、循环)
顾名思义,就是按照所写代码的书写顺序、从上到下的顺序来执行。
集合或映射迭代过程进行删除或修改操作的时候会导致并发异常
集合或映射迭代过程进行删除或修改操作的时候会导致并发异常
158 0
集合或映射迭代过程进行删除或修改操作的时候会导致并发异常
for循环执行的速度快于其内部的点击响应函数
for循环执行的速度快于其内部的点击响应函数
121 0
for循环执行的速度快于其内部的点击响应函数