TEAMLAB

Human knowledge belongs to the world . -AntiTrust

(4) 함수를 통한 분해와 추상화,재귀 소개

MIT - Introduction to Computer Science and Programming in Python

나중에 코드를 십만줄, 백만줄의 형태로 짜야하는가?
아니다.
다음 두 가지가 중요하다!

분해와 추상적 개념

분해

  • 코드에 구조를 두는 방법
  • 코드를 모듈로 나누는 방법
    • 다시 모듈은 프로세스의 성분을 분리한다

추상화

  • 자세한 내용을 숨기도록 한다
  • 무엇의 특정한 내용을 숨기기도 하면서
  • 작은 블랙박스 처럼 행동한다.

함수

함수의 핵심은 위의 2개를 다 제공한다.

  1. 코드를 모듈들로 나누는 것
  2. 자세한 것은 숨기는 것
  3. computation의 일반적인 패턴을 캡쳐하여 일반화 만드는 것.

e.g.1)

>>> def sqrt(x):
...     ans = 0
...     if x>=0:
...       while ans*ans < x : ans = ans+1
...       if ans*ans != x:
...         print(x, 'is not a prefect square!')
...         return None
...       else: return ans
...     else:
...       print(x, 'is a negative number')
...       return None

인자의 값을 넘겨줌으로써 함수를 적용한다.

sqrt(16)
4

- def(definition)

def 바로 옆에 함수의 이름 을 적는다.
이름 바로 옆에 괄호 를 적는다.
이 함수의 형식적인 인자 들을 적용한다.
이 때, 인자가 있을 수도 있고 없을 수도 있다.

- return

어떤 값을 가졌을 떄 computation을 멈추고 return이라는 문자 그대로 이 함수로부터 제어를 돌려준다. 그리고 다음 명령문의 값을 가지고와서 전체 컴퓨테이션의 값을 반환해주는 것이 리턴의 역할이다.

- None

None은 특별한 값으로, 사실 값 이지만 실제 리턴되는 값이 없다.

교수님의 메세지

  • 함수에 각 branch에 return을 사용해서 어떠한 값을 반환하는 코드를 짜는 것을 추천한다.

로컬 바인딩

** 로컬 바인딩은 어떤 다른 로컬 바인딩에 영향을 주지않는다.** 예를 들어, 함수에서 적은 x와 함수 밖의 x는 서로 영향을 주지 않는다. e.g.1)

>>> def f(x):
...     x = x+1
...     return x
...
>>> x =3
>>> x
3
>>> z = f(3)
>>> z
4
>>> x
3

e.g.2)

>>> test = sqrt(16)
>>> test
4
>>> test = sqrt(34)
34 is not a prefect square!
>>> test
>>> test == None
True

순환(Recursion)

순환은 어떤 문제를 가지고 같은 프로그램의 더 간단한 버전으로 바꿔서 내가 실행할 수 있는 단계로 나누기!
문제를 기본 경우귀납적인 단계 또는 순환적인 단계 로 나누어 접근할 수 있다.

  • 기본 경우 : 기본적으로 문제를 푸는 가능한 간단한 문제
  • 귀납적인 단계 or 순환적인 단계 : 문제같은 프로그램을 더 간단한 버전과 다른 단계들로 나누기

이 문제가 기본 경우인지, 그렇지 않다면 아니라면 더 작은 컴퓨테이션으로 줄이고 그 작은 걸 또 작은 컴퓨터이션으로 만들어서 결과적으로 기본경우로 수렴하도록 판단해야한다.
** 기본 경우로 수렴한다는 것은, 코드의 수렴이다. **

e.g.1)

>>> def isPalindrome(s):
...     if len(s) <=1:
...             return True
...     else:
...             return s[0] == s[-1] and isPalindrome(s[1:-1])
>>> isPalindrome('abcdedcba')
True

e.g.2) 피보나치함수

>>> def fib(x):
...     if x==0 or x ==1:
...             return True
...     else:
...             return fib(x-1) + fib(x-2)
...
>>> fib(12)
233
>>> fib(24)
75025

교수님의 메세지

  • 반복해서 다루어지는 문제와 순환적으로 다루어지는 문제들이 있다.
    순환적인 관점에서 문제를 해결을 하는 게 쉽고, 반복적으로 생각하면 어려울 때가 있다.
    어떤 것을 사용하는 것이 좋은 지 결정하는 습관을 가져라