Python3函數之例子

1.分別使用遞歸、循環和生成器求菲波那切數列

  遞歸:python

def fib_rec(n):
    if n == 0:
        return 1
    if n == 1:
        return 1
    return fib_rec(n-1) + fib_rec(n-2)
fib_rec(5)

  循環:app

def fib_loop(n):
    lst = []
    for i in range(n+1):
        if i == 0 or i == 1:
            lst.append(1)
        else:
            lst.append(lst[-1] + lst[-2])
    return lst.pop()
fib_loop(5)
def fib_loop2(n):
    a, b = 1, 1
    for i in range(n+1):
        if i == 0 or i == 1:
            a, b = 1, 1
        else:
            a, b = b, a+b
    return b
fib_loop2(5)

  生成器:函數

def fib_gen():
    i = 0
    a, b = 1, 1
    while True:
        if i == 0 or i == 1:
            yield 1
        else:
            a, b = b, a+b
            yield b
        i += 1
def fib(n):
    gen = fib_gen()
    for _ in range(n):
        next(gen)
    return next(gen)
fib(5)

2.寫一個函數,實現對整數的排序,默認升序排序,不能使用任何內置函數和第三方庫

  fun1:oop

def sort_int(lst, asc=True):
    sort_lst = []
    while lst:
        i = None
        min_int = None
        for i in lst:
            if min_int is None:
                min_int = i
            else:
                if min_int > i:
                    min_int = i
        lst.remove(min_int)
        if asc:
            sort_lst.append(min_int)
        else:
            sort_lst.insert(0, min_int)
    return sort_lst

  fun2:spa

def sort(lst, reverse=False):
    dst = []
    for n in lst:
        for i, e in enumerate(dst):
            if not reverse:
                if n < e:
                    dst.insert(i, n)
                    break
            else:
                if n > e:
                    dst.insert(i, n)
                    break
        else:
            dst.append(n)
    return dst

3.寫一個函數,把整數轉化爲羅馬數字,輸入爲1到3999之間的任意數字

def int2rom(n):
    if n < 1 or n > 3999:
        print('input error.')
        return 0
    rom_lst = [' ',
               'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 
               'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC',
               'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM',
               'M', 'MM', 'MMM']
    rom = ''
    bit = n % 10
    ten = (n % 100) // 10
    hun = (n % 1000) // 100
    tho = n // 1000
    if tho != 0:
        rom += rom_lst[27 + tho]
    if hun != 0:
        rom += rom_lst[18 + hun]
    if ten > 0:
        rom += rom_lst[9 + ten]
    if bit > 0:
        rom += rom_lst[bit]
    return rom

3.2寫一個函數,把整數轉化爲羅馬數字,輸出爲1到3999之間的任意數字

def roman2int(src):
    convert_map = {
        'I':1,
        'V':5,
        'X':10,
        'L':50,
        'C':100,
        'D':500,
        'M':1000
    }
    # MDCCCXCIX
    # XICXCCCDM
    # +10 -1 +100 -10 +100 +100 +100 +500 +1000
    # 1899
    roman = src.upper()[::-1]
    prev = 0
    lst = []
    for x in roman:
        i = convert_map[x]
        if i < prev:
            lst.append(-1 * i)
        else:
            lst.append(i)
        prev = i
    return sum(lst)
roman2int('MDCCCXCIX')

4.寫一個函數,求兩個字符串的最長公共子串

  例如輸入:I love Python 和 Python is a simple language,輸出爲Pythoncode

def psubstring_long(x, y):
    f = []
    max_len = 0
    idx = 0
    for i, a in enumerate(x):
        f.append([])
        for j, b in enumerate(y):
            if a != b:
                f[i].append(0)
            else:
                if i == 0 or j == 0:
                    f[i].append(1)
                else:
                    f[i].append(f[i-1][j-1] + 1)
                if max_len < f[i][j]:
                    max_len = f[i][j]
                    # idx = max_len - (i+1)
                    idx = i + 1 - max_len
    return x[idx: idx + max_len]
psubstring_long('babcdf', 'xxaabcaac')

5.動態規劃

  總長n,step表示一次可選步數,總共多少種走法排序

ret = 0
tmp = []
solution = []
def recursion(n, tmp, step=3):
    global ret
    if n == 0:
        solution.append('===')
        solution.extend(tmp)
        ret += 1
        return 0
    for i in range(1, step+1):
        if n > i-1:
            tmp.append(i)
            recursion(n-i, tmp, step)
            tmp.pop(-1)
    return ret
print(recursion(3, [], 3), solution)

4 ['===', 1, 1, 1, '===', 1, 2, '===', 2, 1, '===', 3]
相關文章
相關標籤/搜索