递归地重排从偶数到奇数的整数序列

时间:2015-04-11 01:14:48

标签: python recursion

这是我一直试图解决的一个练习题:

  

编写一个递归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)

5 个答案:

答案 0 :(得分:1)

<强>声明

我不知道任何python。我正在回答这个问题,对我来说是一个学习练习,因为这个问题对你来说是一个练习。

我没有检查这个答案是否存在语法错误。


我认为您预感到问题是由于evenodd在每次通话时重置都是正确的 - 您需要将它们传递给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])