10장 연습 문제 1번, 2번

1번 문제는 range와 유사한 frange 함수를 만드는 문제이다. 이때 frange 는 range 와는 달리 인수를 실수로 받고, 실수 리스트를 리턴하는 함수이다.

코딩을 먼저 보면
def frange(*factor) :
    def oper(start, stop, step=0.25) :
        result = []
        while start <= stop :
            result.append(start)
            start += step
        return result
    if factor == () :
        print 'Error : There must be One argument'
    elif len(factor) == 1 :
        return oper(0.0, factor[0])
    elif (len(factor) == 2) or (len(factor) == 3) :
        return oper(*factor)
    else :
        print 'Error : Max argument is Three'
와 같이 코딩을 해볼 수 있다.

frange의 인수 개수가 가변일 뿐더러 한개만 주면 stop 의 인수이고, 두개를 주면 처음 것은 start, 나중 것은 stop 이기 때문에 frange 자체에 디폴트 값도 줄 수가 없다.

따라서 가변 인수로 받은 다음 인수가 한개, 두개 또는 세개, 그 이상으로 나누어서 분류 처리를 하였다.


2번 문제는 조합 논리 회로 1비트 덧셈기 adder를 시뮬레이션 하는 문제이다.

여기서 논리와 1비트를 빨강색으로 강조한 이유는 이 문제를 쉽게 코딩 하는데, 핵심 단어이기 때문이다.

논리라는 말과 1비트라는 말을 힌트로 해서 이 문제를 2진법 문제로 풀 수 있다.

문제에서 adder(0, 0)은 (0, 0), adder(1, 1)은 (1, 0), adder(1, 0) 이나 adder(0, 1)은 (0, 1) 이라고 했다.

2진법 문제로 따지면 adder(1, 1) 에서 1 + 1 = 10 이 되므로 이진법 10은 2이다. 즉, 2를 나누어서 이진법 10을 구하므로 코딩을 다음과 같이 해볼 수가 있다.
def adder(a, b) :
    if a<0 or b<0 or a>1 or b>1 :
        print 'Argument is more than 0 and less than 1'
    else :
        return divmod(a+b, 2)
즉, 인수 두개를 받아서 두 개의 합을 구한 다음 2로 나눈 몫과 나머지로 분류를 하는 것이다.

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스