1. 程式人生 > >簡單遞歸算法題

簡單遞歸算法題

func utf elif ... .py 字符串長度 字符 遞歸 div

技術分享
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2017/4/28 16:41
# @Author  : MnCu
# @Site    : 
# @File    : fbnq.py
# @Software: PyCharm

# 一對兔子從出生到可繁殖需兩個月,然後每月都能繁殖一對兔子,問n月後共有多少兔子
def fbnc_func(n):
    ‘‘‘
    1 出口:
        當月份小於等於2月時,則返回1
    2 f(n)與f(n-1)的關系:
        當月的兔子數 = 上個月的兔子數 + 上個月可以繁殖的兔子數
    ‘‘‘
    if n <= 2:
        return 1
    else:
        return fbnc_func(n-1) + fbnc_func(n-2)
# num = fbnc_func(12)
# print(num)

# 樓梯有20階,每次可以走一階或者走兩階,問共有多少種走法
def louti(n):
    ‘‘‘
    1 出口:
        當樓梯數為1時,返回1
        當樓梯數位2時,返回2
    2 關系:
        n層樓梯走法 = (n-1)層樓梯走法 + (n-2)層樓梯走法
    ‘‘‘
    assert n > 0
    if n == 1:
        return 1
    elif n == 2:
        return 2
    else:
        return louti(n-1) + louti(n-2)
# r = louti(20)
# print(r)

# 一列數的規則如下: 1、12、123、1234、12345、123456......,求第n個數的遞歸算法(n<=9)
def tran(n):
    ‘‘‘
    1 出口:
        如果n為1,則返回1
    2 關系:
        當前的數 = int(前一個數的字符串格式 + n的字符串格式)

    ‘‘‘
    n = int(n)
    if n == 1:
        return 1
    else:
        return int(str(tran(n-1)) + str(n))
# r = tran(6)
# print(r)

# 將一整數逆序,如987654321變為123456789。
def reverse(num):
    ‘‘‘
    1 出口: (首先講num轉換為字符串)
        num為空,返回‘‘
        num長度為1,返回num
    2 關系:
        當前被反轉後的數 = 當前未被反轉的數的末尾(字符串格式) + 前面的數(字符串格式)

    ‘‘‘
    num = str(num)
    if len(num) == 0:
        return ‘‘
    elif len(num) == 1:
        return num
    else:
        return num[-1] + reverse(num[:-1])
# r = reverse(123456)
# print(r)

# 請寫一段代碼來計算給定文本內字符“A”的個數。用遞歸方式。
def count(chr):
    ‘‘‘
    1 出口:
        當字符串長度為0返回0
        當字符串長度為1且該字符是‘A’則返回1,否則返回0
    2 關系:
        當前字符串中‘A’的個數 = 上一個字符串(也就是當前字符串減去最後一項)中‘A’的個數 + 最後一個字符中‘A’的個數

    ‘‘‘
    if len(chr) == 0:
        return 0
    elif len(chr) == 1:
        if chr == ‘A‘:
            return 1
        return 0
    else:
        return count(chr[:-1]) + count(chr[-1])
# r = count(‘AALKSJDFK‘)
# print(r)

# 一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
def taijie(n):
    ‘‘‘
    1 出口;
        臺階數為1,則有1種跳法
        臺階數為2,有2種跳法
    2 關系:
        分析:用Fib(n)表示青蛙跳上n階臺階的跳法數,青蛙一次性跳上n階臺階的跳法數1(n階跳),設定Fib(0) = 1;
       當n = 1 時, 只有一種跳法,即1階跳:Fib(1) = 1;
       當n = 2 時, 有兩種跳的方式,一階跳和二階跳:Fib(2) = Fib(1) + Fib(0) = 2;
       當n = 3 時,有三種跳的方式,第一次跳出一階後,後面還有Fib(3-1)中跳法; 第一次跳出二階後,後面還有Fib(3-2)中跳法;第一次跳出三階後,後面還有Fib(3-3)中跳法
        Fib(3) = Fib(2) + Fib(1)+Fib(0)=4;
       當n = n 時,共有n種跳的方式,第一次跳出一階後,後面還有Fib(n-1)中跳法; 第一次跳出二階後,後面還有Fib(n-2)中跳法..........................第一次跳出n階後,後面還有 Fib(n-n)中跳法.
       Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+..........+Fib(n-n)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-1)
      又因為Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-2)
      兩式相減得:Fib(n)-Fib(n-1)=Fib(n-1)         =====》  Fib(n) = 2*Fib(n-1)     n >= 2
    ‘‘‘
    if n == 1:
        return 1
    elif n == 2:
        return 2
    else:
        return 2 * taijie(n-1)
r = taijie(20)
print(r)
技術分享

簡單遞歸算法題