學(xué)習(xí)記錄幾道算法題 - 遞歸練習(xí)

前言

來(lái)啦老鐵!

今天記錄一下最近遇到的幾個(gè)算法相關(guān)的題目,也可能算不上算法,只能算是巧妙的解題方法,一起來(lái)瞅一瞅吧~

題目

  1. 給定任意數(shù)字,要求能按順序輸出每一位,例如8763,要能依次輸出8、7、6、3;

  2. 給定任意英語(yǔ)字符串,要求能輸出用該字符串中所有字母組合而成的字符串,例如給定god要能輸出god, gdo, ogd, odg, dog, dgo;

  3. 給定一組數(shù)據(jù),要求能按間隔輸出該數(shù)據(jù),最終將所有數(shù)據(jù)輸出,例如給定["test1", "test2", "test3", "test4", "test5", "test6", "test7"],假定按間隔2輸出,則輸出順序?yàn)椋簍est1、test4、test7、test5、test3、test6、test2;

接下來(lái)咱們一一完成;

題目1

(給定任意數(shù)字,要求能按順序輸出每一位,例如8763,要能依次輸出8、7、6、3)

def test(number):
    if number // 10 > 0:
        test(number // 10)
    print(number % 10)


if __name__ == '__main__':
    test(8763)

運(yùn)行結(jié)果

以上的題目和解題方法是在數(shù)據(jù)結(jié)構(gòu)與算法書籍中看到的,用到了遞歸的思想,很是巧妙;

筆者在寫這篇文章的時(shí)候,想到了一個(gè)簡(jiǎn)單的方式,也可以參考一下:

def test(number):
    number_string = number.__str__()
    for s in number_string:
        print(s)


if __name__ == '__main__':
    test(8763)

一樣也是可以解題的,遞歸本質(zhì)上也是一種循環(huán);

題目2

(給定任意英語(yǔ)字符串,要求能輸出用該字符串中所有字母組合而成的字符串,例如給定god要能輸出god, gdo, ogd, odg, dog, dgo)

這道題曾經(jīng)讓我廢寢忘食了一個(gè)中午,最后百度后,成功解開(kāi):

def test(str):
    word_length = len(str)
    if word_length <= 1:
        return [str]
    str_list = []
    for i in range(word_length):
        for j in test(str[0:i] + str[i + 1:]):
            str_list.append(str[i] + j)
    return str_list


if __name__ == '__main__':
    print(test("dog"))
字符串排列組合1

沒(méi)錯(cuò),又是一個(gè)巧妙的遞歸題目,筆者隔了幾個(gè)禮拜,第二次寫還是寫不出來(lái),太菜了,要記錄一下~

后面發(fā)現(xiàn)有另外一種現(xiàn)成的辦法,也可以實(shí)現(xiàn),厲害了:

import itertools

res = []


def test(word):
    for w in itertools.permutations(word, 3):
        res.append(''.join(w))
    print(res)


if __name__ == '__main__':
    test("dog")
字符串排列組合2

題目3

(給定一組數(shù)據(jù),要求能按間隔輸出該數(shù)據(jù),最終將所有數(shù)據(jù)輸出,例如給定["test1", "test2", "test3", "test4", "test5", "test6", "test7"],假定按間隔2輸出,則輸出順序?yàn)椋簍est1、test4、test7、test5、test3、test6、test2)

這道題,從某些渠道了解到,可以用循環(huán)鏈表輕松實(shí)現(xiàn),不過(guò)python沒(méi)有鏈表,因此,我自己用自己的思路解了下題目:

queued = []


def test(queue, step, startIndex=0):
    if len(queue) <= 1:
        queued.extend(queue)
        return
    leftList = []
    leftListStartIndex = 0
    for i, v in enumerate(queue):
        if (i + startIndex) % (step + 1) == 0:
            queued.append(v)
            leftListStartIndex = len(queue) - i
            continue
        leftList.append(v)
    test(leftList, step, leftListStartIndex)


if __name__ == '__main__':
    q = ["test1", "test2", "test3", "test4", "test5", "test6", "test7"]
    test(q, 2)
    print("original:", q)
    print("queued:", queued)
隊(duì)列

你沒(méi)看錯(cuò),又用遞歸實(shí)現(xiàn)了~

遞歸有幾個(gè)特點(diǎn):
(準(zhǔn)備從數(shù)據(jù)結(jié)構(gòu)與算法書籍中抄一下)

有時(shí)候表面看起來(lái)挺簡(jiǎn)單的問(wèn)題,其實(shí)蘊(yùn)含深意,就像這幾道題,特別是第2道題,這得多聰明的腦袋?愿你我有越來(lái)越聰明的腦袋~
卷起來(lái)

如果本文對(duì)您有幫助,麻煩動(dòng)動(dòng)手指點(diǎn)點(diǎn)贊?

謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容