鱼C论坛

 找回密码
 立即注册
查看: 2310|回复: 0

[技术交流] 我关于递归的一些小思路

[复制链接]
发表于 2017-6-15 21:52:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 18813034116 于 2017-6-15 21:52 编辑

我觉得递归思路就是逆向思维,即只考虑结果不考虑过程
0. 使用递归编写一个十进制转换为二进制的函数(要求采用“除2取余”的方式,结果与调用bin()一样返回字符串形式)。  
  十进制转二进制,以11转二进制为例:
         11//2=5 ;11%2=1。即11除以2,商为5,余数为1→1
                    ↓
         5//2=2;5%2=1→1
                    ↓
         2//2=1;2%2=0→0
                    ↓
         1//2=0;1%2=1→1
                    ↓
         当商为0的时候就结束了,因为0除以2,商永远为0,余数永远为0。将所得余数拼接起来就是二进制数:1101
                                   1011=1*2^3+0*2^2+1*2^1+1*2^0=8+0+2+1=11
         这里可以看出,编写十进制转二进制的递归函数思路就是:
               1.将十进制数作为参数
               2.下一个参数是上个参数除2的商
               3.所得二进制就是每个参数除2所得余数的拼接,并且要将最后的二进制数作为开头
               4.当参数为0就是函数执行的终点
         除此之外,python的bin函数执行后的二进制数都以'0b'开头,那么我们就当参数为0时,返回的二进制数为'0b',但是这样并不严谨,因为当一开始参数就为0的时候,即bin(0)得到的是0b0,而这样写得到就是0b。可以通过判断一开始的数是否为0,如果是,返回'0b0';如果不是,执行递归
         以下是代码:
def bin_s(n):
    def fun(x):#这个函数用于递归计算二进制数    
        if x==0:
            return '0b'
        else:
            return fun(x//2)+str(x%2)
    if n==0:#判断初始参数是否为0
        return '0b0'
    else:
        return fun(n)


                               
登录/注册后可看大图

1. 写一个函数get_digits(n),将参数n分解出每个位的数字并按顺序存放到列表中。举例:get_digits(12345) ==> [1, 2, 3, 4, 5]
  我的思路就是依次读取参数中的每个数字,并把它们放入一个数组内,如果你获得的参数是纯数字,是无法利用索引获取其中字符的,可以利用str函数将其转换。
  假设获取的参数为s,第一个数字为str(s)[0],下一个数字就是str(s)[0+1],str(s)[0+1+1]......最后一个数字自然是str(s)[len(s-1)]。
  函数执行结果为数组,所以需要初始化一个数组,可是不能在递归函数初始化数组,这样每次递归,数组都会被重置为空,可以采用上题将递归函数作为内置函数,在外包函数初始化数组,以0为递归函数初始参数,以数字串最后一个数字为终点,得到以下函数:
def fun(x):
    arr=[]
    def get_digits(n):
        arr.append(int(str(x)[n]))
        if n==len(str(x))-1:
            return arr
        else:
            return get_digits(n+1)
    print get_digits(0)


                               
登录/注册后可看大图

2.求回文字符串
  一个回文字符串反转后还是一样的,这意味着,如果有一个字符串s,s[0]==s[-(0+1)],s[1]==s[-(1+1)]...s[n]==s[-(n+1)],那么这个字符串s就是回文字符串,并且无论s的长度是奇数还是偶数,只要判断到(len(s)//2)-1,就可以了,因为无论它是否中间加着一个单独的字符,只要两边字符对应相等就可以了。
  以0为递归函数的起始参数,以(len(s)//2)-1为递归终点,并且设置一个变量,如果所有的都相等就为True,否则为False,同理将这个变量放在外包函数初始化。
  此外如果用的是python2,还需要将获取的字符串解码为Unicode类型的,因为如果你的字符串包含了中文,单个获取字符得到的是乱码
  代码如下:
# coding=utf-8
def check_str():
    check=False
    s=raw_input('请输入一个字符串:')
    try:#两种解码方式二选一
        s=s.decode('gbk')
    except:
        s=s.decode('utf8')
    def fun(x):
        if s[x]==s[-(x+1)]:
            check=True
        else:
            check=False
        if x==(len(s)//2)-1:
            return check
        else:
            return fun(x+1)  
    if fun(0):#这里输出的中文也要以Unicode形式,具体原因还不清楚
        print u'这是回文联!'
    else:
        print u'这不是回文联!'
  

                               
登录/注册后可看大图

3.有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
可以从中得到两个信息:
  1、第一个人多少岁
  2、后一个人比前一个大2岁
  如果第一个人岁数为n,则下一个人岁数就为n+2,n+2+2.。。。。。编写这个函数需要两个参数,第一个人的岁数,需要知道第几个人的岁数
  代码如下:
#coding=utf-8
def count_age():
    age=input('请输入第一个人的年龄:')
    n=input('请输入需要知道第几个人的年龄:')
    def fun(x):
        if x==1:
            return age
        else:
            return fun(x-1)+2
    print '第'+str(n)+'个人的年龄是'+str(fun(n))

大部分循环能解决的问题递归能解决,甚至循环难以解决的问题递归也能解决,但递归不是第一选择,比起迭代,递归消耗的内存资源和时间更多,如最后一个问题,如果第一个人年龄是n,那么第m个人年龄就是n+(m-1)*2,直接解决,更便捷


         
   

评分

参与人数 2荣誉 +6 鱼币 +10 贡献 +3 收起 理由
康小泡 + 4
小甲鱼 + 6 + 6 + 3 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 16:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表