对于作业问题,我想从列表中打印项目,逐项递增每个项目。我想使用递归(理想情况下不改变列表)来做到这一点。
注意:我理解递归不是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])
我的问题是,是否可以通过在仍然使用递归时不改变列表副本来简化或改进代码?
答案 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)
#'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]