2015-10-09 75 views
1

我想在冒泡排序算法中使用遞歸,但結果顯示函數「bu_sort」沒有被遞歸使用。我已經在這個問題上工作了很長時間,真的不知道問題在哪裏。爲什麼我不能在冒泡排序中執行遞歸

def bu_sort(input_list): 
    print("start") 
    length = len(input_list) 
    print(length) 
    for i in range(length - 2): 
     print("times") 
     if input_list[i] > input_list[i + 1]: 
      tem = input_list[i + 1] 
      input_list[i + 1] = input_list[i] 
      input_list[i] = tem 
    bu_sort(input_list[:length - 2]) 

test1 = [7,4,2,8,5,1]  
bu_sort(test1) 
print(test1) 

以下爲輸出,只打印一個「啓動」,所以我知道該功能已經執行僅一次

test1 = [7,4,2,8,5,1]  
bu_sort(test1) 
start 
6 
times 
times 
times 
times 

print(test1) 
[4, 2, 7, 5, 8, 1] 
+0

你確定這是你正在運行的確切的代碼?我得到'RuntimeError:最大遞歸深度超過',這是有道理的,因爲你的遞歸永遠不會終止。 – Thomas

+0

我認爲OP缺少一個基本案例。做一些像'if len(input_list)<2:return'。我能夠通過在該函數內添加該塊來複制OP的輸出。 – bourbaki4481472

回答

0

有幾個失誤。首先,正如我在評論中提到的,你錯過了這種遞歸的基本情況。其次,當你執行類似a = b[:index]的操作時,a實際上是Python中的一個新列表,因此您將一個副本而不是引用傳遞給遞歸調用(如果我對此有錯,請有人糾正我)。解決這兩個錯誤給出了下面的代碼。

def bu_sort(input_list): 
    return bu_sort_with_length(input_list, len(input_list)) 

def bu_sort_with_length(input_list, length): 
    if (length < 2): 
     return 
    print("start") 
    for i in range(length - 1): 
     print("times") 
     if input_list[i] > input_list[i + 1]: 
      tem = input_list[i + 1] 
      input_list[i + 1] = input_list[i] 
      input_list[i] = tem 
    bu_sort_with_length(input_list, length - 1) 

test3 = [7]  
bu_sort(test3) 
print(test3) 

test2 = [7,4]  
bu_sort(test2) 
print(test2) 

test1 = [7,4,2,8,5,1]  
bu_sort(test1) 
print(test1) 

輸出:

[7] 
start 
times 
[4, 7] 
start 
times 
times 
times 
times 
times 
start 
times 
times 
times 
times 
start 
times 
times 
times 
start 
times 
times 
start 
times 
[1, 2, 4, 5, 7, 8] 
+0

非常感謝!你對我的原始代碼所說的話是完全正確的。關於第二點,我嘗試修改我的代碼,遵循「a = b [:length -1]」的風格,並得到一個有線答案,我在這個問題上發帖 –

+0

@D_scientist如果這個答案對你有幫助,考慮接受它 – bourbaki4481472