主頁 > 軟體工程 > 使用遞回法合并兩個串列

使用遞回法合并兩個串列

2021-10-17 00:14:00 軟體工程

我想把兩個長度不同的串列中的每一個其他元素合并成一個串列。我不允許使用內置函式 zip,必須使用遞回。

print(zippa([1, 3, 5], [ 2, 4, 6, 8, 10]) 的結果應該是。 [1, 2, 3, 4, 5, 6, 8, 10]/code>.

這是我目前的代碼:

這是我目前的代碼。

def zippal1, l2)。
    if len(l1) == 0:
        return l2[0]   zippa(l1,l2[1:] )
    elif len(l2) == 0:
        return l1[0]   zippa(l1[1:], l2)
    elif len(l1) ==0 and len(l2) == 0:
        return 0: return
    else:
        return zippa(l1[1:0],l2)   zippa(l1,l2[1:0] )

我不明白如何將這些值弄回一個串列中。 elif的順序是否重要?

uj5u.com熱心網友回復:

我不允許使用內置函式zip,必須使用遞回。

這是很不幸的。你的教授或導師(抱歉,假設這是一個學術專案;如果不是,同樣的情緒也適用)正在強迫你錯誤地應用遞回。這就像試圖用一瓶香檳酒而不是滅火器來滅火。當你完成這門課的時候,請使用內置程式和迭代!

一般來說,迭代幾乎總是 Python 中對串列進行操作的正確工具。還有一些問題,遞回實際上是合適的,比如遍歷一棵樹,因為遞回的步驟將問題分解為一個次線性的因素。這里并沒有發生分裂和征服的情況。

為什么遞回不能替代迭代的一些原因:

  • 每一個遞回都是一個很好的例子。
  • 每個遞回呼叫都需要額外的計算作業來分配和銷毀呼叫幀,而回圈則不需要。
  • CPython默認的遞回限制為1000左右,所以如果你的串列超過這個長度(對于任何非微不足道的應用,它們都會超過這個長度),你的程式將會崩潰。你不能無限地擴展呼叫堆疊的大小,所以sys.setrecursionlimit是一個不安全的黑客。
  • 呼叫框架不能相互共享狀態,所以你不得不做一些丑陋的事情,比如給引數添加索引,或者在每次呼叫時用切片復制整個串列(就像你正在做的那樣),在最壞的情況下導致不必要的二次復雜性(就像這里的情況)或者只是尷尬的代碼(例如,如果你想建立一個結果串列,就像這里的情況)。

    有些語言支持尾部呼叫優化,自然適合撰寫這樣的演算法,但是Python 并不是其中之一

    話雖如此,但我知道這是一個教學練習,所以讓我們一起玩,并學習一些關于遞回的知識。


    在深入研究之前,我還想提供一些一般的編程提示。

    當你在演算法上遇到困難時,試著簡化問題。看看你能否合并兩個長度相等的串列,然后,一旦成功,就添加串列長度不同的額外要求。這將消除對一個串列為空而另一個不為空的檢查,一般來說,這將使問題更容易掌握。當你去解決完整的問題時,你已經擁有了最小的子問題的作業代碼,以及你從解決較小的問題空間中獲得的經驗和模式。

    這里的代碼看起來就像你跳到了前面,在沒有測驗的情況下就寫了出來,并且做出了一系列的決定和假設,而這些決定和假設單獨來看并沒有意義。采取更小的步驟。

    列印(或使用除錯器)以檢查每一幀的值。在小的例子上解決演算法問題。

    重要的閱讀。Eric Lippert - 如何除錯小程式.

    讓我們來檢查一下代碼中的一些小問題,并建立起更大的問題。

    elif之類的順序是否重要?

    如果分支條件都是不相干的,那么順序就不重要了,例如:

    如果分支條件都是不相干的,那么順序就不重要了。

    if foo == "a"/span>: return 0: return
    if foo == "b"/span>: return 1: 鈾?
    if foo == "c"/span>: return 2
    

    由于foo不可能同時是"a""b""c",這些分支是互斥的。當你能得到它時,這是一個很好的簡化假設(上面的代碼可以被重構為一個表格查詢,完全洗掉條件鏈)。

    但是如果你有依賴性的檢查,例如

    if len(l1) ==0:
        pass # l1必須是空的;l2可能是也可能不是elif len(l2) == 0pass # l2必須是空的,并且l1已知是不空的# 否則將采取`len(l1) == 0`分支elif len(l1) ==0 and len(l2) == 0:
        pass # unreachable, we've already covered cases# 其中一個或另一個是空的

    那么順序確實很重要。應該首先檢查兩個都是空的情況(你可以簡單地使用if lst:if not lst:來Python地檢查它們的空性)。

    考慮其中一個串列為空的情況:

    if len(l1) == 0:
        return l2[0]   zippa(l1,l2[1:] )
    

    在這一點上,你可以直接 回傳 l2 -- 當一個串列為空時,你需要做的是回傳非空的那個串列,而不是逐個切分。由于你的分支的順序,l2并不保證有一個元素 -- 它很可能是空的。

    接下來,代碼

    elif len(l1) == 0 and len(l2) == 0:
        return 0 # ?!
    

    有一個不一致的型別。我們試圖回傳一個串列,所以兩個空串列的基本情況被合并為一個空串列,而不是整數0。這應該是return [],所以呼叫者在兩個串列上使用 來連接它們,而不是[] 0,這會引發一個TypeError。一個型別化的語言不會讓你這樣寫,即使在一個動態型別化的語言中,混合型別通常也是一種反模式,即使它可以作業。

    在主要的遞回案例代碼中,分片l1[1:0]總是給出一個空串列。將問題分解成一個小塊,并在副本中進行嘗試,以測驗我們的假設,我們看到:

    >>> [1,2,3] [1: 0] []

    很明顯,這不是你的本意。看起來你想在這里對 "交替 "模式進行編碼,所以你可能只是想把第一個元素作為一個串列砍掉:

    >>> [1,2,3] [0: 1] [1] 。 >>> [1,2,3] [:1] [1]

    其次,我不清楚zippa(l1[:1],l2) zippa(l1,l2[:1])模式如何運作。我們有一個無限回圈,因為第一個元素一旦出現,就不會被任何邏輯洗掉。對于線性串列演算法來說,產生1個以上的遞回呼叫并合并結果是沒有必要的。在一次呼叫中合并兩個串列中的每一個元素似乎是最簡單的,在遞回中沒有任何規則說你不能這樣做。

    回到切分問題上,這是不必要的二次復雜性 -- 大量的額外作業只是為了將演算法塞進遞回作業中。我們可以通過在遞回呼叫中傳遞一個索引作為第三個引數來解決復雜性問題和切片問題。這可以是一個默認引數,也可以在內部函式或輔助函式中添加。

    作為最后一個優化點,它也使代碼更加簡單:串列上的每一個 運算子都會分配一個全新的串列!如果我們在每一幀上都這樣做,那么我們的代碼就會更簡單。如果我們在每一幀上都這樣做,我們又回到了二次方的復雜性。如果要將合并串列用于任何非瑣碎的目的,那么它必須只涉及恒定數量的分配(最好是一個)。這可以通過在遞回呼叫中傳遞單個結果串列來實作,并在第一次呼叫中分配一次。

    下面是代碼:

    def merge_iterablesa, b, i=0, result=None)。) 
        if 結果 None。
            結果 = []
    
        if i < len(a) and i < len(b):
            result.append(a[i])
            result.append(b[i])
            merge_iterables(a, b, i   1, result)
        else:
            result.extend(a[i:])
            result.extend(b[i:])
    
        return result
    

    如果你不喜歡將這些引數暴露給呼叫者,可以使用一個內部函式或輔助函式,典型的遞回:

    def merge_iterablesa, b)。 結果 = [] def mergei=0)。 if i < len(a) and i < len(b): result.append(a[i]) result.append(b[i]) merge(i 1) else: result.extend(a[i:]) result.extend(b[i:]) 合并() return result

    注意,雖然我在做切片,但這是在一次性的基本情況下,所以這是恒定的復雜性(無論如何,其中一個或兩個切片是空的)。你可以使用一個傳統的range回圈來避免這些分配,但這是一個不成熟的優化。


    雖然這不是你任務的一部分,但是像這樣的演算法應該可以推廣到任何數量的串列。通過添加一個回圈,這很容易:

    def merge_iterables*its)。
        結果 = []
    
        def mergei=0)。
            for x in its:
                if i < len(x)。
                    result.append(x[i])
    
            if any(i < len(x) for x in its) 。
                merge(i   1)
    
        合并()
        return result
    

    這里的時間和空間復雜度是O(nm)。

    最后,生成器是處理像這樣的可迭代演算法的一種Pythonic方法。itertools使用生成器來處理所有的事情,效仿它是很好的。生成器給了呼叫者最大的靈活性:他們可以使用相同的演算法來合并,比如說,一個可迭代的前半部分,或者以一種記憶體效率高的方式,隨著時間的推移,懶散地進行合并(這些用例是你希望你的演算法使用恒定空間的部分動機!)

    def merge_iterables*its)。 def merge(i=0) 。 for x in its: if i < len(x)。 yield x[i] 。 if any(i < len(x) for x in its) 。 yield from merge(i 1) yield from merge() if __name__ == "__main__"/span>: print(list(merge_iterables([1,2], [4, 5,6,7], "a", "xyz") ) # => [1, 4, 'a', 'x', 2, 5, 'y', 6, 'z', 7]/span>


    說了這么多,對于遞回來說,這仍然是一個臆造的、糟糕的用例(如果有任何疑問的話,可以在一個 1000 元的串列上試試),所以你可能想看看我在經典主題 以交替方式結合兩個串列的神話式方法?中建議的問題解決方案。

    讓我們以該答案中的一些代碼和本答案中的代碼以及這個其他答案中給出的二次解決方法為基準

    import argparse
    import copy
    import dis
    import inspect
    import random
    import sys
    import timeit
    from itertools import zip_longest
    
    sys.setrecursionlimit(1350) # 只是為了測驗def merge_pythonic*its)。
        return [x for y in zip_longest(*its) for X in y if x is not None ]
    
    def merge_iterables*its)。
        結果 = []
    
        def mergei=0)。
            for x in its:
                if i < len(x)。
                    result.append(x[i])
    
            if any(i < len(x) for x in its) 。
                merge(i   1)
    
        合并()
        return result
    
    def zippa*its)。
        if len(its) == 0:
            return []
        
        head_list, *rest_its = its
        
        if head_list:
            head, *rest = head_list
            return [head]   zippa(*rest_its, rest)
        else:
            return zippa(*rest_its)
    
    if __name__ == "__main__"/span>:
        parser = argparse.ArgumentParser()
        parser.add_argument("-n", type=int, default=1300)
        parser.add_argument("-m"/span>, type=int, default=1300)
        parser.add_argument("--trials", type=int,default=1000)
        parser.add_argument("-dis", action="store_true")
        args = parser.parse_args()
        n = args.n
        m = args.m
        trials = args.tries
        namespace = dict(its=[隨機。 sample(range(n), k=n) for _ in range(m)]
        funcs_to_test = [x for x in locals().values() 
                         if callable(x) and x.__module__ == __name__ ]
        print(f"{'-'/span> * 30}
    n = {n}, {trials} 審判
    {'-'/span> * 30}
    ")
    
        for func in funcs_to_test:
            fname = func.__name__
            fargs = ", ".join(inspection.signature(func).parameters)
            stmt = f"{fname}{fargs})"。
            setup = f "from __main__ import {fname}" 
            time = timeit.timeit(sttmt, setup, number=trials, globals=namespace)
            print( inspect.getsource(globals().get(fname))
    
            if args.dis:
                dis.dis(globals() .get(fname))
    
            print(f "time (s) => {'%.16f' % time})
    {'-' * 30 }
    ")
    

    即使有一個不幸的限制,即我們不能使用比一千多個元素更大的測驗(唉!遞回!),結果也很明顯:內置程式粉碎了遞回方法,二次元并沒有像預測的那樣擴展,即使是在微小的輸入上(現實世界的可迭代元素往往是幾十萬、幾百萬或幾十億或更多):

    ------------------------------
    n=1300,m=1300,1000次試驗
    ------------------------------
    
    def merge_pythonic(*its):
        回傳 [x for y in zip_longest(*its) for x in y if x is not None]
    
    時間(s)=> 0.4278396000000000
    ------------------------------
    
    def merge_iterables(*its):
        結果 = []
    
        def merge(i=0):
            for x in its:
                if i < len(x):
                    result.append(x[i])
    
            if any(i < len(x) for x in its):
                merge(i   1)
    
        合并()
        回傳結果
    
    時間(s)=> 4.4487939000000001
    ------------------------------
    
    def zippa(*its):
        if len(its) == 0:
            回傳 []
    
        head_list, *rest_its = its
    
        如果 head_list:
            head, *rest = head_list
            回傳 [head]   zippa(*rest_its, rest)
        否則。
            回傳zippa(*rest_its)
    
    時間(s)=> 40.0880948000000004
    ------------------------------
    

    uj5u.com熱心網友回復:

    處理串列遞回的一個經典方法是分割出串列的頭部,然后對其余部分進行處理。這是你在函式式語言中隨處可見的一種模式,它使遞回成為一等公民。在 Python 中它不是一等公民,但是你仍然可以使用 Python 來學習這些技術。

    在這里我們做了一個可以壓縮任何數量的串列的函式。這很方便,因為一旦你用完了短的串列,你可以繼續呼叫它,直到沒有更多的串列,而不需要大量的 if/else

    def zippa*lists)。
        if len(lists) == 0:
            return [] 。
        
        head_list, *rest_lists = lists
        
        if head_list:
            head, *rest = head_list
            return [head]   zippa(*rest_lists, rest)
        else:
            return zippa(*rest_lists)
        
    print(zippa([1, 3, 5], [2, 4, 6, 8, 10] )。) 
    

    這個任務中唯一真正復雜的是你要處理多個串列。但是想法是一樣的,每個呼叫負責獲取第一個串列,然后從串列中獲取第一個元素。然后用遞回的結果回傳該元素。

    這是在遞回程序中通過旋轉串列來實作的。通過最后傳入原始的第一個串列的其余部分。zippa(*rest_lists, rest)

    這與一個精心選擇的基本案例一起,允許你傳遞任何數量的串列,這反過來又使代碼更簡單。你不需要處理索引或輔助引數。

    # works with a single listprint(zippa([1, 3, 5] )
    # [1, 3, 5]/span>
    
    # or multiple:
    print(zippa([1, 3, 5], [ 2, 4, 6, 8, 10] , [0, 0, 0, 0]) 
    # [1, 2, 0, 3, 4, 0, 5, 6, 0, 8, 0, 10]/span>
    

    轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/319334.html

    標籤:

    上一篇:堆疊中的方法呼叫如何被執行-遞回

    下一篇:無法從空值讀取作業表范圍

  • 標籤雲
    其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

    熱門瀏覽
    • Git本地庫既關聯GitHub又關聯Gitee

      創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

      uj5u.com 2020-09-10 05:04:14 more
    • CODING DevOps 代碼質量實戰系列第二課,相約周三

      隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

      uj5u.com 2020-09-10 05:07:43 more
    • 推薦Scrum書籍

      推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

      uj5u.com 2020-09-10 05:07:45 more
    • CODING DevOps 代碼質量實戰系列最后一課,周四發車

      隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

      uj5u.com 2020-09-10 05:07:52 more
    • 敏捷軟體工程實踐書籍

      Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

      uj5u.com 2020-09-10 05:07:55 more
    • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

      前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

      uj5u.com 2020-09-10 05:08:49 more
    • CODING DevOps 微服務專案實戰系列第一課,明天等你

      CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

      uj5u.com 2020-09-10 05:09:14 more
    • CODING DevOps 微服務專案實戰系列第二課來啦!

      近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

      uj5u.com 2020-09-10 05:09:33 more
    • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

      隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

      uj5u.com 2020-09-10 05:10:00 more
    • CODING 儀表盤功能正式推出,實作作業資料可視化!

      CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

      uj5u.com 2020-09-10 05:11:01 more
    最新发布
    • windows系統git使用ssh方式和gitee/github進行同步

      使用git來clone專案有兩種方式:HTTPS和SSH:
      HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
      SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

      uj5u.com 2023-04-19 08:41:12 more
    • windows系統git使用ssh方式和gitee/github進行同步

      使用git來clone專案有兩種方式:HTTPS和SSH:
      HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
      SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

      uj5u.com 2023-04-19 08:35:34 more
    • 2023年農牧行業6大CRM系統、5大場景盤點

      在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

      uj5u.com 2023-04-18 08:05:44 more
    • 2023年農牧行業6大CRM系統、5大場景盤點

      在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

      uj5u.com 2023-04-18 08:00:18 more
    • 計算機組成原理—存盤器

      計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

      uj5u.com 2023-04-17 08:20:31 more
    • 談一談我對協同開發的一些認識

      如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

      uj5u.com 2023-04-17 08:18:55 more
    • 專案管理PRINCE2核心知識點整理

      PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
      PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

      uj5u.com 2023-04-17 08:18:51 more
    • 談一談我對協同開發的一些認識

      如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

      uj5u.com 2023-04-17 08:18:00 more
    • 專案管理PRINCE2核心知識點整理

      PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
      PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

      uj5u.com 2023-04-17 08:17:55 more
    • 計算機組成原理—存盤器

      計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

      uj5u.com 2023-04-17 08:12:06 more