zoukankan      html  css  js  c++  java
  • 递归经典问题

    阶乘

     1 # 阶乘
     2 
     3 def jiecheng(n):
     4    if n <= 1:
     5       return 1
     6    return jiecheng(n-1) * n 
     7 
     8 print(jiecheng(5))
     9 
    10 
    11 # 阶乘_尾递归
    12 def jiecheng(n, val):
    13     if n == 1:
    14         return val
    15     return jiecheng(n-1, val*n)
    16 
    17 res = jiecheng(5, 1)
    18 print(res)

    斐波那契

     1 # 斐波那契
     2 def fbnq(n):
     3     # 第一个数和第二个数是1
     4     if n == 1 or n == 2:
     5         return 1
     6     # 返回上一个数加上上上个数
     7     return fbnq(n-1) + fbnq(n-2)
     8     
     9 
    10 # 斐波那契_尾递归
    11 def fbnq(n, tem, total):
    12    if n == 1:
    13       return tem
    14    return fbnq(n-1, total, tem+total)

    青蛙跳台阶

     1 '''
     2 一只青蛙要跳上n层高的台阶
     3 一次能跳一级,也可以跳两级
     4 请问这只青蛙有多少种跳上这个n层高台阶的方法?
     5 '''
     6 
     7 
     8 def tiao(n):
     9    # 当n为1 的时候只有一种方法条台阶
    10    if n == 1:
    11       return 1
    12    # 当n为2 的时候有两种方法上台阶 
    13    if n == 2:
    14       return 2
    15    # 与斐波那契相似, 这次台阶的次数是:上次台阶的次数加上上次台阶的次数
    16    return tiao(n-2) + tiao(n-1)
    17 
    18 print(tiao(6))

    翻转字符串

    '''
    底层递归反转字符串 "将14235 反转成53241"
    '''
    
    def fanzhuan(s):
       if len(s) == 0:
          return s
       else:
          # s[1:]传入下个递归函数, s[0]保留在本层递归函数
          # 等递归开始return, 内层递归依次+=外层递归的s[0], 实现反转
          return fanzhuan(s[1:]) + s[0]
    
          
          
    # 翻转字符串_尾递归
    # s: 需要翻转的字符串
    # re_s: 递归结束后return的翻转字符
    
    def fanzhuan(s, re_s=''):
    
        # 如果传入的str长度为0, 证明str已经被翻转完毕, 返回re_s
        if len(s) <= 0:
            return re_s
            
        # 除最后一个外, 其余字符串全部传入下层递归函数
        # 本层最后一个str与上一层函数最后一个str相加
        return fanzhuan(s[:-1], re_s+s[-1])
    
    print(fanzhuan('abdce'))
    
    
    def fanzhuan(s):
        # 传入的str长度为0返回空str, 等待 += 上层的s[0]
        if len(s) <= 0:
            return ''
        # 切片除第一个str外都传入下层递归函数, 
        # 然后等待下层递归函数返回 += s[0]
        return fanzhuan(s[1:]) + s[0]
        
    print(fanzhuan('abcdef'))

    猴子吃桃

     1 '''
     2 猴子吃桃
     3 并吃了一半,又多吃了一个
     4 又将剩下的桃吃一半,又多吃了一个
     5 都吃了剩下的一半又多一个
     6 到了第10天早上在吃时,却发现只剩下一个桃
     7 问!第一天共摘了多少?
     8 '''
     9 
    10 def houzi(day):
    11     # 如果是第十天就返回1(1个桃子)
    12     if day == 10:
    13         return 1
    14     else:
    15         return (houzi(day+1) +1) * 2
    16         
    17         
    18 def houzi(day, n):
    19     if day == 1:
    20         return n
    21     else:
    22         return houzi(day-1, (n+1)*2)
  • 相关阅读:
    windows XP 下的DTRACE 跟踪 学习
    copy to tmp table
    快麦
    SQL SERVER BOOK
    启锐电子面单驱动
    grep---find
    mysql中kill掉所有锁表的进程
    sqlserverinternals.com
    从顺序随机I/O原理来讨论MYSQL MRR NLJ BNL BKA
    解析MYSQL BINLOG二进制格式
  • 原文地址:https://www.cnblogs.com/caihuajiaoshou/p/10611938.html
Copyright © 2011-2022 走看看