2017-08-15 14 views
1

我需要编写一个给定输入列表的函数,列表中的所有相邻元素都相互交换。如果列表的长度是奇数,那么最后一个元素保持放置。我写的功能迭代,就像这样:以迭代和递归的方式在列表中交换对-Python3

>>>def swap(nums): 
    for i in range(0,len(nums),2): 
     try: 
      nums[i],nums[i+1] = nums[i+1], nums[i] 
     except: 
      pass 
    return nums 

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

我像以前一样使用完全相同的逻辑递归版本:

def swap(nums, c=0): 
    try: 
     nums[c], nums[c+1] = nums[c+1], nums[c] 
     return swap(nums, c+2) 
    except: 
     return nums 

虽然两者的工作,我觉得我欺骗了一下用这些try/except块,我不会一直使用它们成为更好的程序员。任何人都可以给我建议如何解决这些问题,而不依赖于try/except块?

+2

你的第二个功能是不是真正利用递归背后的理念。递归通常需要一步*来简化问题,然后将简化的问题传递给它自己(下一个递归步骤)。递归函数的基本结构总是:1.停止条件; 2.递归步骤。如何解决问题的方法是检查长度<2(停止条件),否则交换前两个元素并附加nums [2:] recusion的结果。 – agtoever

回答

4

对于迭代版本,你可以使用range(0, len(nums)-1, 2)来不断循环,直到项目前年为以下几点:

def swap(nums): 
    for i in range(0, len(nums) - 1, 2): 
     nums[i], nums[i + 1] = nums[i + 1], nums[i] 
    return nums 

而在递归版本,你可以检查if c >= len(nums) - 1检查您是否已经到达最后一个项目:

def swap(nums, c=0): 
    if c >= len(nums) - 1: 
     return nums 
    nums[c], nums[c+1] = nums[c+1], nums[c] 
    return swap(nums, c+2) 

这样就可以避免try/except因为你不会提高索引超出范围exception。作为参考,如果您想使用try/except,最好使用except IndexError:而不是一般的except:

输入:

print(swap([1, 2, 3, 4, 5, 6])) 
print(swap([1, 2, 3, 4, 5])) 

输出:

[2, 1, 4, 3, 6, 5] 
[2, 1, 4, 3, 5] 

编辑:

正如@agtoever提到的,你可以修改递归版本是:

def swap(nums): 
    if len(nums) < 2: 
     return nums 
    return [nums[1], nums[0]] + swap(nums[2:]) 
+1

根据我的理解,如果列表是偶数,所有元素应该交换一半位置,您的迭代解决方案将忽略长度为偶数的列表中的最后一个元素 – Teo

+0

@Teo否,不会,我将编辑答案以包含输入/输出 –

+0

你是对的我错了 – Teo

0

迭代:

for i in range(0, len(nums) - (len(nums) % 2), 2): #Skips the last element in an odd length list 
    nums[c], nums[c+1] = nums[c + 1], nums[c] 

递归:

import math 

def swap(nums): 
    if len(nums) == 2: 
    return [nums[1], nums[0]] 
    if len(nums) == 1: 
    return nums[0] 
    half = int(math.ceil(len(nums)/2.0)) 
    return swap(nums[:half]) + swap(nums[half:]) 
0
def swap(li): 
    if len(li) < 2: 
    return li 
    else: 
    return [li[1], li[0]] + swap(li[2:]) 

def swap(li): 
    def swap_iter(inlist, out): 
    if len(inlist) < 2: 
     return out + inlist 
    else: 
     return swap_iter(inlist[2:], out + [inlist[1], inlist[0]]) 
    return swap_iter(li, [])