这是我一直试图解决的一个练习题:
编写一个递归Python函数,重新排列整数值序列,以便所有偶数值出现在所有奇数值之前。
我有什么:
def arrange(x):
even = ''
odd = ''
y = str(x)
if y == '':
return y
elif int(y[0]) % 2 == 0:
even += y[0]
if y[1:] != '':
arrange(int(y[1:]))
else:
odd += y[0]
if y[1:] != '':
arrange(int(y[1:]))
final = int(even + odd)
在运行可视化工具之后,我认为代码中的问题在于每次都重置偶数和奇数。虽然,我需要一切都在一个功能。有什么建议吗?
编辑:如果有人想要使用相同的练习题,则完成 -
even = []
odd = []
def arrange(x):
y = str(x)
if y == '':
return y
elif int(y[0]) % 2 == 0:
even.append(y[0])
if y[1:] != '':
arrange(int(y[1:]))
else:
odd.append(y[0])
if y[1:] != '':
arrange(int(y[1:]))
def complete(x):
evens = ''
odds = ''
arrange(x)
for i in even:
evens += i
for i in odd:
odds += i
return int(evens + odds)
答案 0 :(得分:1)
<强>声明强>
我不知道任何python。我正在回答这个问题,对我来说是一个学习练习,因为这个问题对你来说是一个练习。
我没有检查这个答案是否存在语法错误。
我认为您预感到问题是由于even
和odd
在每次通话时重置都是正确的 - 您需要将它们传递给rearrange
。这是我的尝试:
def arrange(x, evenInput, oddInput):
even = str(evenInput)
odd = str(oddInput)
y = str(x)
if y == '':
return y
elif int(y[0]) % 2 == 0:
even += y[0]
if y[1:] != '':
arrange(int(y[1:]), even, odd)
else:
odd += y[0]
if y[1:] != '':
arrange(int(y[1:]), even, odd)
final = int(even + odd)
答案 1 :(得分:1)
我有一个不同的解决方案,如果你正在使用更大的列表*,它效率不高,但我想对于一项任务来说没关系:
def evenBeforeOdd(x):
if not x:
return []
if x[0] % 2 == 0: #even
return [x[0]] + evenBeforeOdd(x[1:])
else:
return evenBeforeOdd(x[1:]) + [x[0]]
*:如果我没记错的话,一起添加列表就是pricy(O(n),再加上切片,我认为这是O(1)),它需要为列表的每个项目做所以整个事情应该是O(n ^ 2)。此外,它的内存效率也不高,因为它必须始终创建新的列表。
如果我实际上想要在没有递归要求的情况下解决问题,那么它就是这样的:
sorted(myList, key=lambda x: x%2!=0)
答案 2 :(得分:1)
这是一种有效,简短的方法(不是递归)。
Python中的字符串是可迭代的,因此实际上不需要继续使用原始输入的子字符串。相反,您可以过滤掉奇数和偶数数字,然后将它们连接起来。
def splitEvenOdd(x):
even = [e for e in x if int(e)%2 == 0]
odd = [o for o in x if int(o)%2 == 0]
even = "".join(even)
odd = "".join(odd)
return even + odd
答案 3 :(得分:0)
我不确定您想要的输出是什么,或者您是否希望它能够递归并保持结构/顺序。这是一把瑞士军刀。
from pprint import pprint
def even_before_odd(values, keep_structure=False, sort=False):
evens, odds = even_odd(values, keep_structure, sort)
return evens + odds
def even_odd(values, keep_structure=False, sort=False):
evens = []
odds = []
for value in values:
if isinstance(value, list):
_evens, _odds = even_odd(value, keep_structure, sort)
if keep_structure:
# This will insert a sub array
evens.append(_evens)
odds.append(_odds)
else:
# This will append them to the list
evens += _evens
odds += _odds
continue
if value % 2 == 0:
evens.append(value)
else:
odds.append(value)
if sort:
evens = sorted(evens)
odds = sorted(odds)
return evens, odds
values = []
for x in range(0,10):
values.append(list(range(0,10)))
result = even_before_odd(values, False, True)
print "result 1:", ",".join(map(str, result))
result = even_before_odd(values, False, False)
print "result 2:", ",".join(map(str, result))
print "result 3:"
result = even_before_odd(values, True, True)
pprint(result)
输出:
result 1: 0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,6,6,6,6,8,8,8,8,8,8,8,8,8,8,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,9,9,9,9,9,9,9,9,9,9
result 2: 0,2,4,6,8,0,2,4,6,8,0,2,4,6,8,0,2,4,6,8,0,2,4,6,8,0,2,4,6,8,0,2,4,6,8,0,2,4,6,8,0,2,4,6,8,0,2,4,6,8,1,3,5,7,9,1,3,5,7,9,1,3,5,7,9,1,3,5,7,9,1,3,5,7,9,1,3,5,7,9,1,3,5,7,9,1,3,5,7,9,1,3,5,7,9,1,3,5,7,9
result 3
[[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8],
[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9]]
答案 4 :(得分:0)
这是一个简单的解决方案。对于给定的索引ind
,递归地应用func
列表,ind
拥有,然后检查ind
的值是偶数还是奇数。如果是奇数,只需将该值移动到列表的末尾。
当递归开始展开时,它将从列表末尾开始重新排列,当堆栈展开时,列表的先前元素将开始落在正确的位置。
def func(lst, ind=0):
if ind < len(lst):
func(lst, ind+1)
if lst[ind] % 2 != 0:
lst.append(lst.pop(ind))
return lst
print func([3,4,6,2,1])