算法-泛型递归、树的递归

递归

递归 Recursion
递归就是不断的调用自身,不断循环的过程
例如:
我们耳熟能详的故事便是递归:
从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事,讲的故事是:
		从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事,讲的故事是:
			从前有座山,山里有座庙,庙里有个老和尚在给小和尚讲故事,讲的故事是:
				......
电影盗梦空间也是有递归的,第一层梦境,第二层梦境,第三层梦境.....
    
	1.递归的特点是向下进入到不同的递归层,即:盗梦空间中所谓的梦境,向上又回到原来的层,一般来说不能直接跳跃,只能一层一层的下到下一层,一层一层的回到上一层
	2.在盗梦空间中是通过一定的刺激(例如失重、拍打、梦中死亡等)同步回到上一层,而在代码中这种同步的关系是用方法的参数来进行函数不同层之间的传递变量
	3.每一层梦境的环境和周围的人都是一份拷贝,主角进入到每一层,这每一层的建筑和物品都是创建出来的新的,也是隔离的,和其他层梦境互相是独立的,不会互相受到影响,但是主角的那个团队不仅可以穿越到不同的梦境,还可以把自己和自己所要携带的东西都可以带到不同的梦境里面去发生变化,且可以把变化携带回来,此时主角及其团队还有他们所携带的物品就很像方法里面的参数及全局变量
	

递归的简单示例

计算n!
n!=1*2*3*...*n

def Factorial(n):
	if n <= 1:
		return 1
	return n * Factorial(n-1)
            
递归的运行方式是递归栈,一层一层的展开,就有点像洋葱“如果你愿意一层一层一层的剥开我的心,你会发现..”,以一个栈的形式一层一层一层的进去然后把它剥开,栈本身在递归调用的时候其内部就给做了一个调用栈

factorial(6)
6 * factorial(5)
6 * (5 * factorial(4))
6 * (5 * (4 * factorial(3)))
6 * (5 * (4 * (3 * factorial(2))
6 * (5 * (4 * (3 * (2 * factorial(1)))
6 * (5 * (4 * (3 * (2 * 1))
6 * (5 * (4 * (3 * 2))
6 * (5 * (4 * 6)
6 * (5 * 24)
6 * 120
720

递归代码模板

#Python
def recursion(level,param1,param2,...):
	#recursion terminator 递归终结条件,即:递归出口
	if level MAX LEVEL:
     process_result
     return
     
    #process logic in current level 处理当前层的逻辑,该层的业务逻辑代码
    process(level,data...)
         
    #drill down 下探到下一层
    self.recursion(level + 1,p1,...)
         
    #reverse the current level status if needed 清理当前层


//Java
public void recur(int level,int param){
	//terminator
	if (level MAX_LEVEL){
		//process result
		return;
	}
 	
	//process current logic
	process(level,param);
	
	//drill down
	recur(level:level + 1,newParam);
	
	//restore current status
}

递归学习的总结

1.初步学习递归的时候,可以自己手工去画出递归的状态树,去方便自己理解递归的整个流程,但是在之后的使用中要抛弃自己人工递归的这个行为,要锻炼自己直接看方法及需求直接动手写的能力,这样才能熟练使用递归
	--->抵制人工递归

2.找到最近最简的方法,将其拆解成可重复解决的问题(重复子问题)
	--->找最近重复性
    
3.要有数学归纳法的思维
	3.1 最开始最简单的条件是成立的:例如n=0,n=1的时候是成立的
	3.2 能够证明当n成立的时候,可以推导出n+1也是成立的
	--->数学归纳法思维

练习

•	https://leetcode-cn.com/problems/climbing-stairs/
•	https://leetcode-cn.com/problems/generate-parentheses/
 
•	https://leetcode-cn.com/problems/invert-binary-tree/description/
•	https://leetcode-cn.com/problems/validate-binary-search-tree
•	https://leetcode-cn.com/problems/maximum-depth-of-binary-tree
•	https://leetcode-cn.com/problems/minimum-depth-of-binary-tree
•	https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/


•	https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
•	https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
•	https://leetcode-cn.com/problems/combinations/
•	https://leetcode-cn.com/problems/permutations/
•	https://leetcode-cn.com/problems/permutations-ii/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值