2014-10-27 148 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)