首页 > 递归该怎么写(二)

递归该怎么写(二)

对于简单的递归(可以写出数学表达式的递归),我们已经熟练掌握,但是对于有些递归我们有时候无从下手。这时候我们需要将抽象的问题数学化,或者能表达出来。

 (本节需要掌握: 熟悉递归函数的返回是一个什么???

例1:字符串的全排列问题(剑指offer)

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

首先我们考虑该问题是否是可以用相同方法解决? 对于abcd例子

① a b c d 的排列我们首先用表达式表达  Perm(a b c d)  这个表示对 abcd全排列

② 然后发现把abcd 全排列就可以转化为     把 a打头 对 bcd 全排列Perm(b c d)     b打头 对 acd 全排列Perm(a c d)     

c打头 对 abd 全排列Perm(a b d)      d打头 对 abc 全排列Perm(a b c)

这个就不是很简单的递归了,这需要我们加入一些条件(循环),来让它执行递归过程。  其实第二个过程就是一个循环的过程

1 def prem(abcd):
2     for i in abcd:
3       i + prem(没有i的字符串)    我们可以保留的结果



这里我们假设 prem返回的就是 一些字符的排列组合的结果。

比如a + prem(cd) 就相当于 a + [cd, dc] ----> acd adc

注意   :    (这个理解了就很简单了

④ 这时候我们还有十分重要的一步(递归出口在哪呢???)    我们将问题一步步分解,发现 例如  abc排好了  剩下d 一个了,那就不需要执行prem了。

出口就是: 当为一个字符时结束

 1 def Permutation(ss):
 2         # write code here
 3         result = []
 4         if not ss:
 5             return []
 6         if len(ss) ==1:   #出口
 7             return [ss]
 8         for i in range(len(ss)):          #分别固定每一个开头
 9             temp = Permutation(ss[:i] + ss[i+1:])        #排列剩下的, 假设返回一个列表结果
10             for j in temp:
11                 result.append(ss[i] + j)     #保存结果,这部分很难理解  只需要理解第三步就很好理解了
12         return list(set(result))

 

例2:

 

转载于:https://www.cnblogs.com/WSX1994/p/10830963.html

更多相关:

  • 英语的重要性,毋庸置疑!尤其对广大职场人士,掌握英语意味着就多了一项竞争的技能。那,对于我们成人来说,时间是最宝贵的。如何短时间内在英语方面有所突破,这是我们最关心的事情。英语学习,到底有没有捷径可以走,是否可以速成?周老师在这里明确告诉大家,英语学习,没有绝对的捷径走,但是可以少走弯路。十多年的教学经验告诉我们,成功的学习方法可以借...

  • 展开全部 其实IDLE提供了一个显32313133353236313431303231363533e78988e69d8331333365663438示所有行和所有字符的功能。 我们打开IDLE shell或者IDLE编辑器,可以看到左下角有个Ln和Col,事实上,Ln是当前光标所在行,Col是当前光标所在列。 我们如果想得到文件代码...

  • 前言[1]从 Main 方法说起[2]走进 Tomcat 内部[3]总结[4]《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spri...

  • 【本文摘要】【注】本文所述内容为学习Yjango《学习观》相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用。阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英语学习方面,我们的症结所在。学习英语这类运动类知识,需要把握四个原则第一,不要用主动意识。第二,关注于端对端第三,输入输出符合实际情况第四,通过多个例子...

  • 点云PCL免费知识星球,点云论文速读。文章:RGB-D SLAM with Structural Regularities作者:Yanyan Li , Raza Yunus , Nikolas Brasch , Nassir Navab and Federico Tombari编译:点云PCL代码:https://github.co...

  •   class Solution { public:bool isValid(string s) {int start=0,end=s.size()-1;if(end==-1)//万万没想到,他把空字符串当成true了return true;int ss[end+1];//歪方法,把左括号全部<0,右括号都>0,且同类型符号绝对值...