@MStodd에 동의합니다. 재귀는 Python에서이 문제를 해결할 방법이 아닙니다. 매우 긴리스트의 경우, 파이썬은 스택을 오버플로 할 수 있습니다! 짧은 목록의 경우에는 괜찮을 것입니다. 선생님이이 문제를 제기하면이 방법으로해야합니다.
다음은이 문제에 대한 생각입니다. 각 재귀 호출은 다음 세 가지 중 하나를 수행해야합니다. 0) False
을 반환합니다. 목록이 정렬되지 않았기 때문에 반환합니다. 1) 기본 케이스에 도달 했으므로 True
을 반환하십시오. 2) 작업을 중단하고 기본 문제에 도달 할 때까지 남은 문제를 어떻게 든 작게 만듭니다. 기본 작업은 작업을 더 이상 분해 할 수없는 경우입니다.
def recursive_check(lst, i):
# check at the current position "i" in list
# if check at current position fails, return False
# update current position i
# if i is at the end of the string, and we cannot move it any more, we are done checking; return true
# else, if i is not at the end of the string yet, return the value returned by a recursive call to this function
예를 들어, 여기 문자열에서 문자 '@'
가 있는지 확인하는 기능이다 : 여기
는 광범위한 개요이다. 문자열에
@
이 없으면
True
을 반환해야합니다.
def at_check(s, i):
if s[i] == '@':
return False
i += 1
if i >= len(s):
return True
else:
return at_check(s, i)
필자는 앞에서 설명한 내용과 똑같은 내용을 썼습니다. 다음은 동일한 작업을 수행하는 약간 짧은 버전이지만 정확히 같은 순서는 아닙니다.
def at_check(s, i=0):
if i >= len(s):
return True
if s[i] == '@':
return False
return at_check(s, i+1)
편집 : 나는 at_check()
에 인수 i=0
을 넣어 통지. 즉, i
의 "default"값은 0이됩니다.이 함수를 호출하는 사람은 at_check(some_string)
을 호출 할 수 있으며 첫 번째 호출에 대해 0을 명시 적으로 전달하지 않을 수 있습니다. 기본 인수는 첫 번째 0 인수를 제공합니다.
i
에 실제로 추가해야하는 유일한 시간은 함수를 재귀 적으로 호출 할 때입니다. 1을 더하는 부분은 중요한 "작업 중단"부분입니다. 우리가 아직 확인하지 않은 문자열의 부분은 i
뒤에있는 부분이며, 그 부분은 호출 할 때마다 작아집니다. 나는 당신이 아직 "슬라이스"에 대해 배웠는지 알지 못하지만 "조각"을 사용하여 각 호출마다 문자열을 작고 작게 만들 수 있습니다. 이런 방식으로 작동하는 버전이 있습니다. 너가 아직 썰기 알지 않으면 그것을 무시 하십시요. 이 버전에서
def at_check(s):
if s == '': # empty string
return True
if s[-1] == '@': # is last character '@'?
return False
return at_check(s[:-1]) # recursive call with string shortened by 1
는 빈 문자열은 기초의 경우입니다. 빈 문자열에는
@
이 포함되어 있지 않으므로
True
을 반환합니다. 마지막 문자가
@
인 경우
False
을 반환 할 수 있습니다. 그렇지 않으면 마지막 문자를 잘라 버리고 함수를 재귀 적으로 호출합니다. 여기서 우리는 작업이 끝날 때까지 문자열을 문자 그대로 짧고 짧게 만들어 작업을 중단합니다. 그러나 1을 인덱스 변수에 추가하고 문자열을 통해 인덱스를 이동하는 것은 동일한 것입니다.
재귀를 사용하여 작업을 분석하고 각 재귀 호출에 대해 몇 가지 작업을 수행 할 때까지이 예제를 연구하십시오. 그런 다음 목록을 정렬할지 여부를 찾는 문제에이 아이디어를 적용하는 방법을 파악할 수 있는지 확인하십시오.
행운을 빈다.
통찰력에 감사드립니다. 나는 논리를 처리하고 내가 무엇을 생각해 내는지 보려고 노력할 것이다. 통찰력을 주셔서 고마워요. – captainHawk