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

1 投票
2 回答
684 浏览
提问于 2025-04-30 00:32

这个程序需要在一个列表中把两个数字替换成另一个给定的数字。我不能改变这些参数,但我可以创建其他的函数。而且我必须使用递归的方法。到目前为止,我已经搞清楚了怎么用递归来替换数字,但我对计数有点困惑。每次我尝试的时候,总是替换掉所有的'x'为'y',而不是只替换前两个出现的'x'。
补充说明:我不能使用全局变量。

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

这里有一个使用内部函数的替代方案,它没有像接受的解决方案那样的限制:

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)
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:])

撰写回答