关于递归

本文介绍了递归算法,指出其可实现无限循环体,解决循环次数不定的问题。编写递归算法难点在于思维方式与一般思维相逆,要从最后状态思考。还阐述了递归三定律,同时指出递归对空间资源消耗大,实际开发能不用就不用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 为什么需要递归

我觉得有一种说法比较容易理解:利用递归可以实现无限循环体。
即当面对循环次数不定的问题时,递归可以简洁的给出问题的解答。递归的作用当然不止于此,但是光这一点就已经使得它足够重要了。

2. 递归思想的难点

个人觉得编写递归算法的难点就在于这种思维方式与人类的一般思维方式相逆,我们习惯于从问题解决过程的 initial state 开始思考问题,而使用递归就要趋向于从 last state (simplest state)开始思考:假设前面 n-1 步都完成了,第 n 步应该怎么做。以最简单的阶乘问题为例:

def factorial(n):
	if n == 0:
		return 1
	else:
		return n * factorial(n-1)

这个问题的思考过程就是前 n-1 个整数的阶乘已经完成了,那么最后一步就是用 n 乘上这个结果。函数不断调用自身,使得其状态不断接近基本情况(出口),最后到达出口(n == 0)结果回调得到问题的答案。
再比如汉诺塔问题

def hanoi(n, fromPole, toPole, withPole):
	if n >= 1:
		hanoi(n-1, fromPole, withPole, toPole)
		moveDisk(fromPole, toPole)
		hanoi(n-1, withPole, toPole, fromPole)
def moveDisk(fromPole, toPole):
	print('from:', fromPole, 'to:', toPole)
if __name__ == '__main__':
	hanoi(3, 'A', 'C', 'B')

这里 A、B、C 分别代表起始杆,中间杆和目标杆。假设移动前 n-1 个环的方法已经实现,思考最后一步应该做什么:先把 n-1 个环移到 B 上,只有最后一个最大的环还在 A 上,移动这个最大的环到 C 上,最后把 B 上的 n-1 个环移到 C 上。函数不断调用自身,直到没有环的情况。
归并排序

def mergeSort(alist):
	if len(alist) <= 1:
		return alist
	else:
		mid = len(alist) // 2
		left = alist[:mid]
		right = alist[mid:]
		mergeSort(left)
		mergeSort(right)
		
		i, j, k = 0, 0, 0
		while i < len(left) and j < len(right):
			if left[i] < right[j]:
				alist[k] = left[i]
				i += 1
			else:
				alist[k] = right[j]
				j += 1
			k += 1
		while i < len(left):
			alist[k] = left[i]
			i += 1
			k += 1
		while j < len(right):
			alist[k] = right[j]
			j += 1
			k += 1
	return alist
if __name__ == '__main__':
	print(mergeSort([5,6,4,3,0,9,7]))

在左半部分列表和右半部分列表上调用 mergeSort 函数,则认为这两部分它们已经被排序,那么当前要做的就是把这两部分合并,即按顺序挑选两部分中最小的项赋给结果列表。

3. 递归三定律
  • 递归算法必须具有基本情况(递归出口)
  • 递归算法必须逐步改变其状态并向基本情况靠近
  • 递归算法必须以递归方式调用自身
4. 缺点

递归的缺点很明显,就是对于空间资源的过分消耗。因此在实际开发过程中,简单说来就是:能不用递归就不要用

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值