2017-08-15 3 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ステップ*を要し、単純化された問題を自身に渡す(次の再帰ステップ)。再帰関数の基本構造は常に次のとおりです。1.停止条件。再帰ステップ。あなたの問題の再考の方法は、長さが<2(停止条件)であるかどうかをチェックし、それ以外の場合は最初の2つの要素を交換し、nums [2:]再帰の結果を追加します。 – 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) 

あなたが範囲exception外のインデックスは発生しませんので、あなたがtry/exceptを避けることができるこの方法。参考のために、try/exceptを使用する場合は、except:の代わりにexcept IndexError:を使用することをお勧めします。

入力:

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] 

EDIT:

@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, []) 
関連する問題