2014-10-27 143 views
1

程序必須用參數中給出的數字替換列表中的兩個數字。我無法更改參數,但我也可以創建其他功能。另外我必須使用遞歸。到目前爲止,我想出瞭如何用遞歸進行替換,但我對計數感到困惑。每次我嘗試的時候,我都無法用'y'代替頭兩次出現'x',而是總是用'y'代替每個'x'。 編輯:而我不能使用全局變量。如何向遞歸函數添加計數器? [Python]

def replaceFirstTwo(x,y,lst): 
if lst == []: 
    return [] 
else: 
    if lst[0] == x: 
     return [y] + replaceFirstTwo(x,y,lst[1:]) 
    else: 
     return [lst[0]]+ replaceFirstTwo(x,y,lst[1:]) 

正確的結果應該是這樣的:

replaceFirstTwo(1,2,[5,1,2,3,1,1]) 
[5, 2, 2, 3, 2, 1] 

回答

0

如果x永遠只能將是肯定的,那麼你可以使用,負版本,以表示它是你的第二次運行該功能。在將x改爲表示意味着什麼都不做。

我已經修改了你的函數,所以它做到了這一點,但它不會與x的負值一起工作,因爲abs(x)會使它正確。

def replaceFirstTwo(x,y,lst): 
    if lst == []: 
     return [] 
    else: 
     if x is not None: 
      if lst[0] == abs(x): 
       if x > -1: 
        x = -x 
       else: 
        x = None 
       return [y] + replaceFirstTwo(x,y,lst[1:]) 
      else: 
       return [lst[0]]+ replaceFirstTwo(x,y,lst[1:]) 
     else: 
      return [lst[0]]+ replaceFirstTwo(x,y,lst[1:]) 
0

下面是一個使用一個內部函數的替代,其具有沒有任何限制,例如接受的解決方案:

def replaceFirstTwo(x, y, lst): 
    def sub(lst, res, count): 
     if lst: 
      e = lst[0] 
      if e == x and count < 2: 
       return sub(lst[1:], res+[y], count + 1) 
      else: 
       return sub(lst[1:], res+[e], count) 
     else: 
      return res 
    return sub(lst, [], 0)