在Python中递归打印列表而不改变列表

时间:2013-10-07 11:17:16

标签: python recursion

对于作业问题,我想从列表中打印项目,逐项递增每个项目。我想使用递归(理想情况下不改变列表)来做到这一点。

注意:我理解递归不是Python或任何其他语言的标准解决方案(我不打算在任何现实世界的Python实现中使用它)但这是CS课程的递归部分的一部分。

我认为通过使用简单的for循环(我尚未学习列表推导),可以更简单地以更加Pythonic的方式解决这个问题:

def iter_increment(p):
    for n in p:
        print n + 1

print iter_increment([1,2,3,4])

为了递归地解决这个问题,我创建了一个列表副本:

def rec_increment(p):
    if len(p) == 0:
        return
    else:
        r = list(p)
        print r.pop(0) + 1
        return rec_increment(r)

print rec_increment([1,2,3,4])

我的问题是,是否可以通过在仍然使用递归时不改变列表副本来简化或改进代码?

6 个答案:

答案 0 :(得分:5)

def rec_increment(p):
    if len(p) == 0:
        return ""                    #If you return an empty string, you don't get the "None" printing at the end.
    else:
        #r = list(p)                 This is not necessary now.
        print p[0]+1                 #r.pop(0) + 1   Rather than pop, just index.
        return rec_increment(p[1:])  # Only recurse on the 2nd-nth part of the list

print rec_increment([1,2,3,4])       # Note that you don't need to both "print" in the function *and* print the result of the function - you can pick which you want to do.

答案 1 :(得分:1)

如果您不想在每个递归步骤中创建新列表,则可以递归迭代索引。例如:

def rec_increment(l, i = None):
    if i is None:
        i = len(l) - 1
    if i >= 0:
        rec_increment(l, i - 1)
        print(l[i] + 1)

i is None检查是能够在没有第二个参数的情况下初始化它。

>>> rec_increment([1,2,3,4])
2
3
4
5

答案 2 :(得分:1)

您基本上需要将循环实现为递归调用。这是短暂而甜蜜的:

def rtraverse(seq, i=0):
    if i < len(seq):
        print seq[i] + 1
        rtraverse(seq, i+1)

rtraverse([1, 2, 3, 4])

只要i超过列表的长度,递归就会自动结束。

答案 3 :(得分:1)

def fun(lst, i = None):
    if i is None:
        i = 0
    if i-1 == len(lst)-1:
        return ''
    print lst[i]
    i += 1
    fun(lst, i)


fun([1,3,4,5])

答案 4 :(得分:0)

see discussions on udacity

#'Return a list of numbers with each of its elements increased by 1.'
# This is a small jump in difficulty from the previous problem,
# so here's a hint: You don't need to mutate a list.

def rtraverse(seq, i=0):
    if i == len(seq)-1:
        return [seq[i]+1]
    return [seq[i]+1] + rtraverse(seq,i+1)

答案 5 :(得分:-1)

好的,这是递归的尝试,我一开始并不知道你的意思的正式定义:

>>> def inc(list, i=0):
...    if i < len(list):
...        list[i] += 1
...        i += 1
...        inc(list,i)
... 
>>> inc(list)
>>> list
[3, 12]
>>> inc(list)
>>> list
[4, 13]