1

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

注意:我知道递归不是 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])

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

4

6 回答 6

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.
于 2013-10-07T11:20:51.857 回答
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
于 2013-10-07T11:27:08.040 回答
1

您基本上需要将循环实现为递归调用。在这里,简短而甜蜜:

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

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

一旦i超过列表的长度,递归就会自行结束。

于 2013-10-07T11:41:05.230 回答
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])
于 2017-08-22T09:35:45.490 回答
0

参见关于 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)
于 2021-01-12T02:18:42.997 回答
-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]
于 2013-10-07T11:18:55.950 回答