2017-02-05 4 views
0
def count_even(obj): 
""" 
Return the number of even numbers in obj or sublists of obj 
if obj is a list. Otherwise, if obj is a number, return 1 
if it is an even number and 0 if it is an odd number. 

@param int|list obj: object to count even numbers from 
@rtype: int 

>>> count_even(3) 
0 
>>> count_even(16) 
1 
>>> count_even([1, 2, [3, 4], 5]) 
2 
""" 
count = 0 
if isinstance(obj, int): 
    if obj % 2 == 0: 
     return 1 
    else: 
     return 0 
else: 
    for i in obj: 
     count += count_even(i) 
    return new 

2番目の行「count + = count_even(i)」で「recursion」が[1,2]のネストされたリスト[3,4]にアクセスする方法がわかりません、[3,4]、5]。再帰はネストされたリストにどのようにアクセスしますか?

forループは各アイテム{i = 0(1)、i = 1(2)、i = 2([3,4])、i = 3(5)}を検索しませんintなので、[3,4]のif文はトリガされません。

+0

は正しいコードの最後の行ですか? 'return new 'ではなく' return count'を期待しています( 'new'が定義されていないので例外が発生するはずです)。 – Blckknght

答えて

3

あなたが述べたように、最初のif超える値[3, 4]スキップ[3, 4]intでないため)ので、その後、他のを実行し、ため、関数はネストされたリスト[3, 4]にアクセスすることが可能です。それ以外の場合は[3, 4]以上のループを作成し、奇数/偶数の場合は34をチェックします。ここ

あなたは、物事を整理するのに役立つトレースです:

obj = [ 1, 2, [3, 4], 5 ] 
count_even(obj) => 
    count_even([ 1, 2, [3, 4], 5]) => 
    is obj an `int`? No => 
     for i in [ 1, 2, [3, 4], 5] => 
     count_even(1) => 
      is 1 an int? Yes => return 0 because 1 is odd 
     count_even(2) 
      is 2 an int? Yes => return 1 because 2 is even 
     count_even([3, 4]) => 
      is [3, 4] an int? No => 
      for i in [3, 4] => 
       count_even(3) => 
       Is 3 an int? Yes => return 0 because 3 is odd 
       count_even(4) => 
       Is 4 and int? Yes => return 1 because 4 is even 
     count_even(5) => 
      is 5 an int? Yes => return 0 because 5 is odd 
関連する問題