1. 程式人生 > >在數組中尋找對應和

在數組中尋找對應和

結束 numbers 代碼 一個 des 得到 列表 not def

Input:長度為n的數組作為查找對象,一個數字作為要查找的標準

Output: 挑選出數組中滿足和為該數字的子數組

思路:

試想,若有一數組為[1, 2, 3, 4, 5, 6, 7, 8, 9]找到和為6的子數組。結果應該為[1,2,3], [1,5], [2,4], [6]。

當挑選出一個數字 i 後,繼續查找的和是6 - i,數組去掉一個 i 元素。

同時,保持要查找的和不變,查找的子數組中不帶有 i 元素的子數組

def find_numbers(desired_sum, list_of_nb):
    ‘‘‘
    >>> find_numbers(6, [1,2,3,4,5,6])
    [[6], [4, 2], [5, 1], [3, 2, 1]]
    
‘‘‘ return _find_numbers(desired_sum, list_of_nb) def _find_numbers(desired_sum, list_of_nb): if desired_sum < 0: return if not list_of_nb: if desired_sum == 0: return [[]] return L1 = _find_numbers(desired_sum, list_of_nb[1:]) L2 = _find_numbers(desired_sum - list_of_nb[0], list_of_nb[1:])
if not L2: return L1 L2 = [R + [list_of_nb[0]] for R in L2] if L1: return L1 + L2 else: return L2

具體代碼如上

使用遞歸的思想,base case是當desired_sum小於0時,返回一個空值,因為這種情況是錯誤的

當列表為空時,說明已經查找到最後,在此時,如果要求的和也為0,說明查找結束,返回一個列表的列表

否則,說明查找失敗,返回一個空值

L1和L2分別對應兩種情況,也即是得到沒有list_of_nb[0]的結果和有list_of_nb[0]的結果

如果L2為一個空值,說明沒有這種結果,那麽返回另一種情況

否則要加上當前減去的那個值

如果L1是空值,那麽只有L2存在,返回L2

否則把L1的情況加入到L2中

在數組中尋找對應和