10장 연습 문제 6번, 7번, 8번

6번 문제는 data.txt 파일에 들어 있는 내용을 다시 x, y, z 에 묶는 작업을 하는 함수를 만드는 문제이다.
l = f.readlines()
x, y, z = map(lambda a, b, c : [a, b, c], l[0].split(), l[1]. split(), l[2].split())
먼저, 파일에서 라인 단위로 분리하여 얻은 리스트를 l에다가 저장한 다음 각 값을 공백 분리해서 얻은 리스트를 매핑 시켰다. 매핑을 시키고 나면 튜플이 나오므로 튜플 내에 들어 있는 리스트를 x, y, z 에 언패킹 해서 대입시켰다.


7번 문제는 팩토리알 함수를 재귀적으로 만드는 문제이다. 이거는 파이썬 글 중에서 [쉬어가기]에 한번 언급해본 적이 있다.
def fact(n) :
    if n == 0 or n == 1 :
        return 1
    elif n < 0 :
        return 0
    return n * fact(n-1)
    
n = int(input('Number : '))
이와 같이 코딩해볼 수 있다. 다만 재귀적 함수의 단점은 함수를 계속 메모리에 저장하는 만큼 횟수가 증폭할 수록 속도가 느려진다는 점이다. 또한 파이썬에서는 재귀함수의 수가 제한 되어 있는데, 내가 해본 바로는 989 번 까지 가능하다는 점이다.

팩토리얼 함수의 경우 재귀함수 대신 반복문을 써서 해결할 수도 있지만 재귀함수가 아니고서는 코딩이 복잡해지는 경우도 있다. 이런 경우에는 재귀함수를 쓰는 것이 매우 효과적이다. 이런 경우의 예로 8번 문제가 될 수 있다.


8번은 반복문으로만 풀기에는 복잡하다. 그러나 재귀함수를 쓰면 매우 간단하게 풀 수가 있다.
def list_value_change(old_value, new_value, l) :
    for k in range(len(l)) :
        if type(l[k]) == type([]) :
            list_value_change(old_value, new_value, l[k])
        else :
            if l[k] == old_value :
                l[k] = new_value
리스트 내의 값이 리스트일 경우 함수를 한번 더 불러서 반복하면 된다. 이때 리스트에 들어 있는 값은 레퍼런스이므로 그 값을 그대로 넘기기만 해도 모든 값들을 변경할 수가 있다.

댓글 없음:

댓글 쓰기

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