삽질의 현장/- ETC

프로그램을 작성하는 33가지 방법 - Chaptor 07 정리

shovelman 2019. 3. 23. 19:41

최근 '프로그래밍 패턴 (프로그램을 작성하는 33가지 방법)' 을 읽기 시작했다.

한 가지의 기능을 Chaptor 마다 각각 다른 패턴으로 구현하여 설명한 책이다.

모두 비슷하게 동작하지만 환경과 상황이라는 제약 조건 안에서 탄생된 패턴을 직접 코드로 보여주고 있어직접 코딩을 하며 이해하고 있는 중이다.

책에서 소개하는 한 가지 기능은 '텍스트 파일을 읽어 단어 빈도 출력' 하는 프로그램이다.


가장 빈도가 높은 단어 순으로 그에 해당하는 빈도를 내림차순으로 출력하는 기능을 구현하고 있다.

이전 Chaptor 보기 :프로그램을 작성하는 33가지 방법 - Chaptor 06 정리

Chaptor 07. 무한 거울

  • 문제에서 모든 또는 중요한 부분을 귀납법을 통해 모델링한다.
  • 즉, 기초 사례(n0) 다음에 n+1 규칙을 명시한다.
  • 귀납법
    • 어떤 현상을 관찰하고 거기서 어떤 원리를 유도해 내는 일
    • 개별적인 특수한 사실이나 원리로부터 일반적이고 보편적인 명제 및 법칙을 유도해 내는 일
    • 여기서 귀납법으로 접근했다는 방식의 의미는
      • 기초 사례를 하나 이상 풀고
      • 그 해법이 (Nth) 사례에서 유효하면 (Nth + 1) 사례에서도 유효한 해법을 제공하는 방식으로 일반 목표를 달성한다
         → 컴퓨팅에서는 일반적으로 재귀(recursion)을 통해 표현한다.
    • 재귀의 기원은 수학적 귀납법에서 유래한다.
    • 1950년대 초기 프로그래밍 언어에서는 재귀 호출을 지원하지 않았다.
    • 1960년대 일부 프로그래밍 언어에서 재귀를 지원했고, 70년대에 이르러 일반적인 요소로 자리 잡았다.


빈도 회수를 센다

def count(word_list, stopword, wordfreqs):
    # 빈 리스트일 때 할 일
    if word_list == []:
        return
    # 귀납적 사례, 단어 목록으로 할 일
    else:
        # 가장 앞 단어를 처리한다
        word = word_list[0]
        if word not in stopword:
            if word in wordfreqs:
                wordfreqs[word] += 1
            else:
                wordfreqs[word] = 1
        # 가장 끝 단어를 처리한다.
        count(word_list[1:], stopword, wordfreqs) ## 재귀


귀납법을 사용하여 출력한다

def wf_print(wordfreqs):
    if wordfreqs == []:
        return
    else:
        (w, c) = wordfreqs[0]
        print (w, '-', c)
        wf_print(wordfreqs[1:]) ## 재귀