Python 알고리즘 연습과 재귀 호출 기초

2019-05-21

문제해결능력이 부족하다고 판단하여 파이썬으로 알고리즘을 간간히 공부하고 있다.

스스로 어느 정도 최소한의 수준에 도달했다고 느낄때까지 적어보려 한다.

문제: 1부터 n까지 연속한 숫자의 제곱의 합을 구하는 프로그램을 만들어 보세요.

def squ_plus(n):
	s=0
	for i in range(1, n+1):
		s+=(i*i)
	return s

range는 1부터 n+1미만의 값까지를 의미한다.

만약 n에 10을 넣으면 range(1, 11)을 의미하고 for는 1부터 11미만 즉 10까지 탐색할 것이다.

문제: 1부터 n까지의 합 구하기를 재귀 호출로 만들어 보세요.

def s(a):
	if a<= 1:
		return 1
	return a + s(a-1)

만약 n이 5라면 1부터 5까지 합을 구할 것이다.

1 + 2 + 3 + 4 + 5 = (n-4) + ... + (n-1) + n 과 같은 의미이다.

필자같은 수포자라면 보고 이해 안되는게 당연하니 직접 계산과정을 하나하나 써보며 이해하는게 좋다.

5부터 차례대로 계산하면 return 5 + s(4) -> s(4) = return 4 + s(3) -> s(3) = return 3 + s(2) -> s(2) = return 2 + s(1) -> s(1) = 1

즉 전부 다 더하면 15라는 값이 나온다.

프로그램을 실행해봐도 동일한 값이 나온다.

재귀 호출함수의 종료를 위해 특정 조건이 있어야하는데 여기서는 a가 0이거나 1일때 종료한다.

어차피 1이 가장 작은 값이기 때문이다.

재귀 호출의 일반적인 형태는 아래와 같다

def func(입력 ):
    if 충분히 작은 입력값:
        return 결과
    ...
    func( 작은 입력값):
        ...
    return 결과

즉 재귀 호출 함수에 들어가는 인자는 최초 입력 값보다 더 작은 값이 들어가게 설계되어야 한다.

그래야지 마지막에는 충분히 작은 입력값을 만나 종료할 수 있다.