만약 n의 값이 좀 더 크거나 알 수 없다면 문제가 되는 부분은 if문에 있는 자리 별로 7이 있는지를 판별하는 문제입니다. 만약 Python의 setrecursionlimit이 굉장히 높게 잡혀 있어 100자리 정도의 숫자까지 input이 들어온다면 그것을 모두 if문에 쓸 수는 없겠죠? 따라서 이 부분도 재귀화를 시켜봅시다.
먼저 앞전의 완성된 소스입니다.
n = int(input())
def pdfs(k):
if(k>n):
return 0
if(k%7==0 or k%10==7 or int(k/10)%10==7 or int(k/100)%10==7 or int(k/1000)%10==7):
return mdfs(k+1)+1
else:
return pdfs(k+1)+1
def mdfs(k):
if(k>n):
return 0
if(k%7==0 or k%10==7 or int(k/10)%10==7 or int(k/100)%10==7 or int(k/1000)%10==7):
return pdfs(k+1)-1
else:
return mdfs(k+1)-1
print(pdfs(1))
저 if문을 수정하여 봅시다. 각 자리수에 7이 있는지 검사하기 위해 앞선 소스에서는 10으로 나눈 몫에서 10을 나누고, 또 100으로 나눈 몫에서 10을 나누고.. 를 반복하였습니다. 이 부분을 재귀함수로 구현할 수 있을 것 같습니다. 10으로 나눈 나머지가 7이 아니라면, 10으로 나눈 몫을 재귀 함수에 넘겨주고, 이 과정을 숫자가 0이 될 때 까지 하면 될 것입니다. 다음과 같이 작성할 수 있습니다.
def hasSeven(k):
if(k==0):
return False
if(k%10==7):
return True
return hasSeven(int(k/10))
위의 소스를 적용하여 완성된 소스입니다.
n = int(input())
def hasSeven(k):
if(k==0):
return False
if(k%10==7):
return True
return hasSeven(int(k/10))
def pdfs(k):
if(k>n):
return 0
if(k%7==0 or hasSeven(k)==True):
return mdfs(k+1)+1
else:
return pdfs(k+1)+1
def mdfs(k):
if(k>n):
return 0
if(k%7==0 or hasSeven(k)==True):
return pdfs(k+1)-1
else:
return mdfs(k+1)-1
print(pdfs(1))