본문 바로가기

재귀

(5)
[EP 023] 두 과잉수의 합으로 나타낼 수 없는 모든 수의 합 완전수는 자신보다 작은 약수의 합이 자신과 같은 수이다. 예로는 6, 28 등이 있다. 과잉수는 이 합이 자신보다 큰 것을 말한다. 두 과잉수의 합으로 나타낼 수 없는 모든 양의 정수의 합은? 자신을 포함하는 모든 약수의 합, 즉 약수함수가 곱셈적이라는 성질 때문에 재귀함수를 만들거나 캐시리스트를 만드는 방식으로 "쪼개서" 문제를 해결하는 전략을 쓸 수 있다. 아래코드는 s 라는 리스트에 약수함수값을 저장하여 n의 약수함수값을 s[n] 으로 가져올 수 있고, n = p q 일 때에, 가장 작은 소수인수를 만나면, s(n) = s[p] s[q] 라는 성질을 이용하여, 차례대로 s 리스트를 채우는 방식으로 문제를 풀어본 것이다. # PROJECT EULER # PROBLEM 23 def s_f(n): """..
재귀 시험지 분배 비유 재귀에 대한 비유가 생각나서 써 봄. 학교 다녀 본 사람은 시험시간에 시험지를 나누는 두가지 방법이 있는 것을 안다.1. 선생님이 돌아다니면서, 모든 사람에게 하나씩 시험지를 나누어 준다.2. 매 줄마다 학생수만큼 시험지를 맨 앞사람에게만 주고, 시험지 더미을 받은 사람은 자신이 하나를 갖고, 시험지 더미를 뒷사람에게 준다. 즉, 대략 def 시험지나눠주기(시험지더미, 학생들):# 학생들 = [ 학생1, 학생2, 학생3, ..., 학생n ]for 학생 in 학생들:시험지하나주기(학생)시험지더미-=1 def 시험지나눠주기뒤로넘기기(시험지더미, 학생들):# 학생들 = [ 학생1, 학생2, 학생3, ... 학생n ]학생들[0].시험지하나갖기() # 학생들[0] 은 시험지를 받은 학생들 리스트의 첫번째 학생시험..
[Euler Project 114] 몇 칸짜리 격자를 빨간색이나 검은 색으로 채운다. 이 조건만 있으면 단순히 2의 n승으로 답이 끝난다. 조건은 빨간색은 최소한 연속 3칸 이상 이어져 있어야 한다는 조건이 추가되어 문제가 복잡해진다. 제일 처음 칸 부터 한칸씩 빨간색을 칠할 지, 검은 색을 칠할지를 결정하는 함수를 구성했고, 이 함수를 재귀적으로 불렀다. 어차피 한 칸을 채운 다음에는 남은 몇 칸에 대해 고민하는 것은 똑같으니까. 이전에 빨간색이 아니었다면, 빨간색이 오면 3칸이 무조건 칠해진다. 경우의 수가 줄어든다. 그리고 마지막에 3칸 미만이 남아 있으면 무조건 검정색이 들어갈 수밖에 없다. 뭐 이런 조건들을 함수에서 분기해야 했다. 처음에는 완성된 격자를 다 프린트하는 함수를 만들어서 예시로 주어진 7칸 짜리를 해 봤고, 50을 ..
[Euler Project 164] 연속된 세 개의 자리수의 합이 9를 넘지 않는 20자리수 연속된 세 개의 자리수의 합이 9를 넘지 않는 20자리수의 갯수를 구하라. ( http://projecteuler.net/index.php?section=problems&id=164 ) def get_count(n1, n2, remain): #print " "*(20 - remain), n1, n2, remain if cache.has_key((n1, n2, remain)): return cache[(n1, n2, remain)] count = 0 sum = n1 + n2 if remain == 1: cache[(n1, n2, remain)] = 10 - sum return 10 - sum for n3 in range(10 - sum): count += get_count(n2, n3, remain - 1..
[Py] 숫자 리스트와 합이 주어졌을 때, 리스트의 합이 주어진 합인 부분 리스트 찾기 #----------------------------------------------------- def is_in_list(lst, lstlst): lst.sort() bRet = False for e in lstlst: e.sort() if len(e) == len(lst): bRet = True for i in range(len(e)): if e[i] != lst[i]: bRet = False break return bRet #----------------------------------------------------- def find_combination(sum, list): # print "---------" # print "-----------", sum, list, "------------..