アルゴリズム-再帰アルゴリズム


再帰アルゴリズム

  • 재귀 알고리즘:再び自分を呼ぶ
  • 終了条件に戻る準備ができていなければ無限ループが発生する.
  • 次の例ではnum<=0に終了条件が付加されている.
  • # 재귀 알고리즘
    def recursion(num):
        if num > 0 :
            print('*'*num)
            return recursion(num-1)
        else:
            return 1


    ハノイタワー

  • 하노이 탑:パズルゲームの一種で、3本の柱で円板を別の柱に移す.
  • 円板は一度に1枚しか移動できない.
  • 大円板は小円板にはできません
  • # 하노이 탑 이동 순서 출력
    def hanoi(start, to, end, n):
        if n == 1:
            print(start, end)
        else:
            hanoi(start, end, to, n-1)
            print(start, end)
            hanoi(to, start, end, n-1)


    配置


    1.連結ソート

  • 병합 정렬:データ構造を分割し、分割されたデータ構造ごとに並べ替えてから、連結並べ替えを行う
  • [8, 1, 4, 3, 2, 5, 10, 6]
  • [8, 1, 4, 3][2, 5, 10, 6]
  • [8, 1][4, 3] [2, 5][10, 6]
  • [8, 1][4, 3] [2, 5][10, 6]
  • [8][1] [4][3] [2][5] [10][6]
  • [1, 8][3, 4] [2, 5][6, 10]
  • [1, 3, 4, 8][2, 5, 6, 10]
  • [1, 2, 3, 4, 5, 6, 8, 10]
  • # 병합 정렬
    def mSort(ns):
        if len(ns) < 2:
            return ns
        midIdx = len(ns) // 2
        leftNums = mSort(ns[:midIdx])
        rightNums = mSort(ns[midIdx:])
    
        mergeNums = []
        leftIdx = 0; rightIdx = 0
    
        while leftIdx < len(leftNums) and rightIdx < len(rightNums):
            if leftNums[leftIdx] < rightNums[rightIdx]:
                mergeNums.append(leftNums[leftIdx])
                leftIdx += 1
            else:
                mergeNums.append(rightNums[rightIdx])
                rightIdx += 1
        
        mergeNums = mergeNums + leftNums[leftIdx:]
        mergeNums = mergeNums + rightNums[rightIdx:]
    
        return mergeNums
    
    nums = [8, 1, 4, 3 ,2, 5, 10, 6]
    print('mSort(nums) : {}'.format(mSort(nums)))

    2.クイックソート

  • 퀵 정렬:標準値より小さい値と標準値より大きい値とを分けて再結合します.
  • [8, 1, 4, 3, 2, 5, 10, 6]
  • [1, 4, 3, 2, 4] | [ 5 ] | [8, 10, 6, 8]
  • [1, 2] | [ 3 ] | [4, 4] | [5] | [ 6 ] | [8, 8, 10]
  • [1] | [ 2 ] | [3] | [4] | [ 4 ] | [5] | [6] | [ 8 ] | [8][10]
  • # 퀵 정렬
    def qSort(ns):
        if len(ns) < 2 :
            return ns
    
        midIdx = len(ns) // 2
        midVal = ns[midIdx]
    
        smallNums = []
        sameNums = []
        bigNums = []
    
        for n in ns:
            if n < midVal:
                smallNums.append(n)
            elif n == midVal:
                sameNums.append(n)
            else:
                bigNums.append(n)
            
        return qSort(smallNums) + sameNums + qSort(bigNums)
    
    nums = [8, 1, 4, 3, 2, 5, 10, 6]
    print('not sorted nums : {}'.format(nums))
    print('sorted nums : {}'.format(qSort(nums)))