Python 3 中的递归
Recursion in Python 3
我试图以不同的方式进行合并排序(而不是文本中可用的方式等等),现在我有一个成功的合并算法,但问题是当我递归调用半列表时,合并的东西没有得到更新。帮我解决递归中的可变生命问题。
下面给出的代码的输出是:-
[9, 5]
After merging [5, 9]
[12, 4]
After merging [4, 12]
[9, 5, 12, 4] #it should be (the updated one i.e [5, 9, 4, 12])
After merging [5, 9, 12, 4]
[6, 8]
After merging [6, 8]
[45, 2]
After merging [2, 45]
[6, 8, 45, 2]
After merging [6, 8, 45, 2]
[9, 5, 12, 4, 6, 8, 45, 2]
After merging [4, 5, 6, 8, 9, 12, 45, 2]
[9, 5, 12, 4, 6, 8, 45, 2]
def merge(arr1, arr2):
"""
Input is two sorted lists
Output is a single merged list
"""
for i in arr1:
for j in list(range(len(arr2))):
if i<arr2[j]:
arr2.append(arr2[-1])
for count in list(range(len(arr2)-1, j, -1)):
arr2[count] = arr2[count-1]
arr2[j] = i
break
if j == len(arr2)-1:
arr2.append(i)
return arr2
def mergeSort(arr):
if len(arr) !=1:
mergeSort(arr[:len(arr)//2])
mergeSort(arr[len(arr)//2:])
print(arr)
arr = merge(arr[:len(arr)//2],arr[len(arr)//2:])
print("After merging", arr)
else:
return arr
a = [9,5,12, 4, 6, 8,45, 2]
mergeSort(a)
print(a)
您应该将 mergeSort
return 合并为列表,调用者应该输出 mergeSort
的 returning 值:
def merge(arr1, arr2):
merged = []
while arr1 and arr2:
if arr1[0] > arr2[0]:
arr1, arr2 = arr2, arr1
merged.append(arr1.pop(0))
merged.extend(arr1 or arr2)
return merged
def mergeSort(arr):
if len(arr) <= 1:
return arr
return merge(mergeSort(arr[:len(arr)//2]), mergeSort(arr[len(arr)//2:]))
a = [9, 5, 12, 4, 6, 8, 45, 2]
print(mergeSort(a))
我只做了很少的改动,所以代码仍然是你的,你是如此接近,看:
问题是,在检查你的代码之后,你必须将两半传递给 merge 方法,还要检查它是否为空。此外,return 的结果要好得多,而不是在原地进行更改-
def merge(arr1, arr2):
for i in arr1:
for j in list(range(len(arr2))):
if i<arr2[j]:
arr2.append(arr2[-1])
for count in list(range(len(arr2)-1, j, -1)):
arr2[count] = arr2[count-1]
arr2[j] = i
break
if j == len(arr2)-1:
arr2.append(i)
return arr2
def mergeSort(arr):
if len(arr) !=1 and len(arr):
ary1 = mergeSort(arr[:len(arr)//2])
ary2 = mergeSort(arr[len(arr)//2:])
print(arr)
ary3 = merge(ary1,ary2)
print("After merging", ary3)
return ary3
else:
return arr
a = [9,5,12, 4, 6, 8,45, 2]
print(mergeSort(a))
输出
[9, 5]
After merging [5, 9]
[12, 4]
After merging [4, 12]
[9, 5, 12, 4]
After merging [4, 5, 9, 12]
[6, 8]
After merging [6, 8]
[45, 2]
After merging [2, 45]
[6, 8, 45, 2]
After merging [2, 6, 8, 45]
[9, 5, 12, 4, 6, 8, 45, 2]
After merging [2, 4, 5, 6, 8, 9, 12, 45]
[2, 4, 5, 6, 8, 9, 12, 45]
我试图以不同的方式进行合并排序(而不是文本中可用的方式等等),现在我有一个成功的合并算法,但问题是当我递归调用半列表时,合并的东西没有得到更新。帮我解决递归中的可变生命问题。
下面给出的代码的输出是:-
[9, 5]
After merging [5, 9]
[12, 4]
After merging [4, 12]
[9, 5, 12, 4] #it should be (the updated one i.e [5, 9, 4, 12])
After merging [5, 9, 12, 4]
[6, 8]
After merging [6, 8]
[45, 2]
After merging [2, 45]
[6, 8, 45, 2]
After merging [6, 8, 45, 2]
[9, 5, 12, 4, 6, 8, 45, 2]
After merging [4, 5, 6, 8, 9, 12, 45, 2]
[9, 5, 12, 4, 6, 8, 45, 2]
def merge(arr1, arr2):
"""
Input is two sorted lists
Output is a single merged list
"""
for i in arr1:
for j in list(range(len(arr2))):
if i<arr2[j]:
arr2.append(arr2[-1])
for count in list(range(len(arr2)-1, j, -1)):
arr2[count] = arr2[count-1]
arr2[j] = i
break
if j == len(arr2)-1:
arr2.append(i)
return arr2
def mergeSort(arr):
if len(arr) !=1:
mergeSort(arr[:len(arr)//2])
mergeSort(arr[len(arr)//2:])
print(arr)
arr = merge(arr[:len(arr)//2],arr[len(arr)//2:])
print("After merging", arr)
else:
return arr
a = [9,5,12, 4, 6, 8,45, 2]
mergeSort(a)
print(a)
您应该将 mergeSort
return 合并为列表,调用者应该输出 mergeSort
的 returning 值:
def merge(arr1, arr2):
merged = []
while arr1 and arr2:
if arr1[0] > arr2[0]:
arr1, arr2 = arr2, arr1
merged.append(arr1.pop(0))
merged.extend(arr1 or arr2)
return merged
def mergeSort(arr):
if len(arr) <= 1:
return arr
return merge(mergeSort(arr[:len(arr)//2]), mergeSort(arr[len(arr)//2:]))
a = [9, 5, 12, 4, 6, 8, 45, 2]
print(mergeSort(a))
我只做了很少的改动,所以代码仍然是你的,你是如此接近,看:
问题是,在检查你的代码之后,你必须将两半传递给 merge 方法,还要检查它是否为空。此外,return 的结果要好得多,而不是在原地进行更改-
def merge(arr1, arr2):
for i in arr1:
for j in list(range(len(arr2))):
if i<arr2[j]:
arr2.append(arr2[-1])
for count in list(range(len(arr2)-1, j, -1)):
arr2[count] = arr2[count-1]
arr2[j] = i
break
if j == len(arr2)-1:
arr2.append(i)
return arr2
def mergeSort(arr):
if len(arr) !=1 and len(arr):
ary1 = mergeSort(arr[:len(arr)//2])
ary2 = mergeSort(arr[len(arr)//2:])
print(arr)
ary3 = merge(ary1,ary2)
print("After merging", ary3)
return ary3
else:
return arr
a = [9,5,12, 4, 6, 8,45, 2]
print(mergeSort(a))
输出
[9, 5]
After merging [5, 9]
[12, 4]
After merging [4, 12]
[9, 5, 12, 4]
After merging [4, 5, 9, 12]
[6, 8]
After merging [6, 8]
[45, 2]
After merging [2, 45]
[6, 8, 45, 2]
After merging [2, 6, 8, 45]
[9, 5, 12, 4, 6, 8, 45, 2]
After merging [2, 4, 5, 6, 8, 9, 12, 45]
[2, 4, 5, 6, 8, 9, 12, 45]