これは、再帰を使用したかなり長いが正しい(質問の議論からわかる限り)実装です。
重要なポイント:
- を使用して両方のリストを反復処理します
.pop(index)
。これにより、再帰を使用できます。関数が再帰するにつれて両方のリストがどんどん小さくなり、一方のリストがlen(0)
.
- 番号はどちらのリストからでも選択でき、1 つのリストから連続して選択できる番号に制限はありません。
- 連続した重複は許可されません。
- 等しくない 2 つの数字を比較する場合、常に小さい方の数字が大きい方に配置されます。23xxx は常に 32xxx よりも低くなります。
基本的に、次のようなものがある場合[1,2,3]
、[6,0,4]
最初のリストのすべての数字は 2 番目のリストの最初の数字の前になります。 x に選択された値。
z = [None]
#set to None so that z[-1] doesn't throw an out-of-range error
def small_list(a,b): #recursive function
### BASE CASE ###
if len(a) == 0: #if one list empty, can only add rest of other list
for i in b:
if i != z[-1]: #account for duplicates
z.append(i)
# else: #don't add duplicates
return z.pop(0) #end recursion, remove extraneous None
elif len(b) == 0: #if one list empty, can only add rest of other list
for j in a:
if j != z[-1]:#account for duplicates
z.append(j)
# else: #don't add duplicates
return z.pop(0) #end recursion, remove extraneous None
#Otherwise, we need to check whichever is smaller.
#The smaller number should ALWAYS go in the larger place (tens,hundreds,etc.) to make a smaller number.
### RECURSIVE CASE ###
if a[0] < b[0]:
if a[0] != z[-1]:
z.append(a.pop(0))
else:
a.pop(0)
elif a[0] > b[0]:
if b[0] != z[-1]:
z.append(b.pop(0))
else:
b.pop(0)
elif a[0] == b[0]:
a.pop(0)
small_list(a,b) # recur
例:
z = [None]
l1 = [1,2,3,2]
l2 = [2,1,1,1]
small_list(l1,l2)
print z
この最初の例[1, 2, 1, 3, 2]
は、現在正しいものを出力します。
z = [None]
l1 = [1,2,3]
l2 = [4,5,6]
small_list(l1,l2)
print z
この 2 番目の例は、これも正しく出力さ[1, 2, 3, 4, 5, 6]
れます。
上記の例を計算する方法の流れは次のとおりです。
# The format is: [final list] len(a) [list a] len(b) [list b]
[] len(a) = 6 [3, 4, 5, 7, 9, 2] len(b) = 6 [3, 5, 7, 4, 2, 8]
# 3 repeated, so remove it.
[] len(a) = 5 [4, 5, 7, 9, 2] len(b) = 6 [3, 5, 7, 4, 2, 8]
# add lower of first two indices to final (4 v 3), and remove from corresponding list
[3] len(a) = 5 [4, 5, 7, 9, 2] len(b) = 5 [5, 7, 4, 2, 8]
# add lower of first two indices to final (4 v 5), and remove from corresponding list
[3, 4] len(a) = 4 [5, 7, 9, 2] len(b) = 5 [5, 7, 4, 2, 8]
# 5 repeated, so remove it.
[3, 4] len(a) = 3 [7, 9, 2] len(b) = 5 [5, 7, 4, 2, 8]
# add lower of first two indices to final (7 v 5), and remove from corresponding list
[3, 4, 5] len(a) = 3 [7, 9, 2] len(b) = 4 [7, 4, 2, 8]
# 7 repeated, so remove it.
[3, 4, 5] len(a) = 2 [9, 2] len(b) = 4 [7, 4, 2, 8]
# add lower of first two indices to final (9 v 7), and remove from corresponding list
[3, 4, 5, 7] len(a) = 2 [9, 2] len(b) = 3 [4, 2, 8]
# add lower of first two indices to final (9 v 4), and remove from corresponding list
[3, 4, 5, 7, 4] len(a) = 2 [9, 2] len(b) = 2 [2, 8]
# add lower of first two indices to final (9 v 2), and remove from corresponding list
[3, 4, 5, 7, 4, 2] len(a) = 2 [9, 2] len(b) = 1 [8]
# add lower of first two indices to final (9 v 8), and remove from corresponding list
[3, 4, 5, 7, 4, 2, 8] len(a) = 2 [9, 2] len(b) = 0 []
# list b is empty, add first element of list a (if non-duplicate)
[3, 4, 5, 7, 4, 2, 8, 9] len(a) = 1 [2] len(b) = 0 []
# list b is empty, add first element of list a (if non-duplicate)
#Finally:
[3, 4, 5, 7, 4, 2, 8, 9, 2]