如何在递归函数中添加计数器? [蟒蛇]

时间:2014-10-27 21:01:11

标签: python recursion replace count

程序必须用列表中的两个数字替换参数中给出的数字。我无法更改参数,但我也可以创建其他功能。另外我必须使用递归。到目前为止,我想出了如何用递归替换,但我对计数感到困惑。每次我尝试我似乎只能取代前两次出现的' x'与' y相反,我总是会更换每一个' x'用' y'。 编辑:我不能使用全局变量。

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]

2 个答案:

答案 0 :(得分: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:])

答案 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)