一直以来,对于递归算法,我们都很推崇,但是又很讨厌。在不做处理的情况下,递归算法低效率,高内存;而且,递归层有限制,会给我们程序带来很大的bug。推崇,因为他将冗长的代码变得简单明了。而且,生活中往往很多问题,都可以递归。由一小部分的关系,渐渐的往上推理,找到其中的规律。但是,知道是一回事,怎么应用又是另外的一回事,下面,就我遇到的一个问题来谈谈递归
问题如下:
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
-
1
-
11
-
21
-
1211
-
111221
1 被读作 “one 1” (“一个一”) , 即 11。
11 被读作 “two 1s” (“两个一”), 即 21。
21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
初见时,我没有太多的想法,就是简简单单的根据提示,将字符串拆分:先找到第一个数,确定下来后,看看第二个数是否一样,直到找到不一样的为止,然后,将其出现次数用len求出,加上其本身,之后再对后面做同样的操作,简单来说就是递归。大致的函数如下:
def readnum(s):
a=s[0]
if len(set(s))1:
return (str(len(s))+str(s[0]))
if len(set(s))>1:
i=0
while i < len(s):
if as[i]:
i=i+1
continue
if a!=s[i]:
return str(len(s[0:i]))+a+readnum(s[i::])
之后,我们大致可以通过一个循环求出我们希望得到的结果。
通过此题,我不是说这个解法有多好,只是想简单说明一下遇到问题时的一个思考方式和递归联系起来;当然,此题也有缺陷,递归层次会有超范围的情况,还望有大神指导一下。