목록 및 재귀 추가 (해밍 거리) - 파이썬 3
-
23-12-2019 - |
문제
문자열의 문자열과 숫자를 사용하는 프로그램을 작성하고 원래 문자열의 해밍 거리 내의 모든 문자열을 출력합니다.나는 모든 것을하는 함수를 가지고 있지만 출력에는 목록 내에 목록이 있습니다.나는 이것이 왜 이것이 재귀적이고 때로는 가능한 값 목록을 반환 할 수있는 이유를 이해합니다.
문제는 그것을 변경하는 방법을 모르므로 완전한 문자열을 출력합니다.예를 들어 "0000"및 해밍 거리 "2"문자열의 경우 다음을받습니다. [ "1 [ '100', '010', '001']", "01 ['10 ','01 ']", "001 ['1 ']
그러나 내가 원하는 것은 다음과 같습니다 :
1100
1010
1001
0110
0101
0011
.
코드는 다음과 같습니다.
def hamming(num, dist):
if dist == 0:
return num
else:
outputlist = list()
for item in range(len(num)):
if len(num[item:]) > dist - 1:
if num[item] == "0":
restoflist = hamming(num[item + 1:], dist - 1)
outputlist.append(num[:item] + "1" + str(restoflist))
else:
restoflist = hamming(num[item + 1:], dist - 1)
outputlist.append(num[:item] + "0" + str(restoflist))
return outputlist
. 해결책
hamming
에서 반환 된 목록을 반환하면 문자열을 올바른 방향으로 함께 추가 할 수 있어야합니다.
def hamming(num, dist):
if dist == 0:
return num
else:
outputlist = list()
for item in range(len(num)):
if len(num[item:]) > dist - 1:
if num[item] == "0":
restoflist = hamming(num[item + 1:], dist - 1)
if type(restoflist) is not str
for rest in restoflist:
outputlist.append(num[:item] + "1" + str(rest))
else
outputlist.append(num[:item] + "1" + str(restoflist))
else:
restoflist = hamming(num[item + 1:], dist - 1)
if type(restoflist) is not str
for rest in restoflist:
outputlist.append(num[:item] + "0" + str(rest))
else
outputlist.append(num[:item] + "0" + str(restoflist))
return outputlist
. 다른 팁
기본 케이스의 [num]
를 기밀 한 경우 num
를 반환하여 고정 할 수 있으며 일반 경우는 map
및 extend
가 아닌 append
를 사용하여 재귀 호출의 결과를 결합합니다.
def hamming(num, dist):
if dist == 0:
return [num]
else:
outputlist = list()
for item in range(len(num)):
if len(num[item:]) > dist - 1:
if num[item] == "0":
restoflist = hamming(num[item + 1:], dist - 1)
outputlist.extend(map(lambda x: num[:item] + "1" + x, restoflist))
else:
restoflist = hamming(num[item + 1:], dist - 1)
outputlist.extend(map(lambda x: num[:item] + "0" + x, restoflist))
return outputlist
>>> hamming('0000', 2)
['1100', '1010', '1001', '0110', '0101', '0011']
>>>
. 제휴하지 않습니다 StackOverflow