1227讲解(递归deng)

本文深入讲解了递归的概念,通过老和尚讲故事的例子生动阐述了递归的思想。接着介绍了电影院找座位问题,展示了递归如何简化复杂问题。文章详细讨论了递归解题的必要条件,并提供了求n!、1242楼梯问题、1244错排问题和1241汉诺塔问题的递归解决方案。此外,还提及了重庆市第十届大学生程序设计比赛中的递归题目,帮助读者理解和应用递归。
摘要由CSDN通过智能技术生成

递归:

迭代为人,递归为神。

老和尚讲故事

从前有座山,山上有座庙,庙里有个老和尚,老和尚他说:“从前有座山,山上有座庙,庙里有个老和尚,老和尚他说:‘从前有座山,山上有座庙,庙里有个老和尚,老和尚他说:’ ”...

void的函数调用自身

电影院问座位(递和归的过程)

假设黑暗中一群懒人在电影院里,某人想知道自己坐在哪一排,于是问前一排的人「你坐在哪一排?」,前面的人 (代号 A) 回答后,他就知道自己在哪一排了——只要把 A 的答案加一就行。不料 A 比他还懒,也不想数,也问他前面的人 B「你坐在哪一排?」,这样 A 可以用和他一模一样的步骤知道自己所在的排。然后 B 也如法炮制。直到他们这一串人问到了最前面的一排,第一排的人告诉问问题的人「我在第一排」。最后大家就都知道自己在哪一排了。

返回值

用递归方法来解决问题必须符合两个条件:

可以把一个问题转化成一个新的问题,而新问题的解法和原问题的解法完全相同,只是处理对象的规模不同

必须要有一个明确的递归终止条件

 

例,求n!


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
递归树(Recursion Tree)是一种可视化递归算法的方式,它通过将递归算法转化为树形结构来帮助我们更好地理解递归算法的执行过程和时间复杂度。 在递归算法中,每次递归调用都会产生一个新的子问题,直到达到基本情况,然后逐级返回结果。这样的递归过程可以用一棵树来表示,其中每个节点代表一个递归调用,子节点代表对应的子问题,叶子节点代表基本情况的返回值。 举个例子,假设我们要求一个数组的所有子集,可以使用如下的递归算法: ``` void subsets(vector<int>& nums, int start, vector<int>& subset, vector<vector<int>>& res) { res.push_back(subset); for (int i = start; i < nums.size(); i++) { subset.push_back(nums[i]); subsets(nums, i+1, subset, res); subset.pop_back(); } } vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; vector<int> subset; subsets(nums, 0, subset, res); return res; } ``` 我们可以将递归过程可视化为下面的递归树: ``` [] / | \ [1] [2] [3] / \ / \ | [1,2] [1,3] [2,3] [3,4] [1,2,3] / \ | [1,2,3] [1,3,4] [2,3,4] ``` 其中,[]代表一个子集,每个节点代表一次递归调用,左子节点代表将当前元素加入子集,右子节点代表不将当前元素加入子集。当递归到数组末尾时,就返回一个空子集。 通过递归树,我们可以更好地理解递归算法的执行过程,并且可以根据递归树来分析时间复杂度。在上面的例子中,递归树的深度为数组的长度N,每个节点会被访问一次,因此时间复杂度为O(2^N)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值