2011-11-01 3 views
1

文字列に部分文字列 "ou"が現れる回数を返す再帰関数(パラメータが1つだけ)を書く方法を理解しようとしています。私が混乱しているところは、len以外の組み込みの文字列関数、またはインデックスとスプライシングのための文字列演算子[]と[:]を使用できないということです。だから私は使用することはできません見つける組み込みの検索機能再帰関数でカウントを保持する

私はこのような何かを見て覚えているが、それは2つのパラメータを使用し、それはまた、

def count_it(target, key): 
    index = target.find(key) 
    if index >= 0: 
    return 1 + count_it(target[index+len(key):], key) 
    else: 
    return 0 
+3

引数は、どのようなタイプにすることができますか?タプルを渡すことは許されていますか? –

答えて

2

非常に効率が悪いのfind()メソッドを使用しますが、すべきです作品:

def count_it(target): 
    if len(target) < 2: 
     return 0 
    else: 
     return (target[:2] == 'ou') + count_it(target[1:]) 

オンラインで作業、それを参照してください:ideone

それは基本的にあなたが投稿したコードと同じ考えです、それだけで一つの文字を動かすことを除いてfindを使用する代わりに文字列を一度に使用して、次のマッチにジャンプします。

+0

それは動作します!私は初心者ですが、なぜそれは非効率だと言いますか? –

+0

@ Will S:主な問題は 'x [1:]'は文字列全体を(最初の文字とは別に)コピーする必要があるということです。これはO(n * n)の複雑さを与える。 –

0

(だけではなく、「OU」をキーの任意の値)、それは一般的なケースのために働く、これを試してみてください:

def count_it(target, key): 
    if len(target) < len(key): 
     return 0 
    found = True 
    for i in xrange(len(key)): 
     if target[i] != key[i]: 
      found = False 
      break 
    if found: 
     return 1 + count_it(target[len(key):], key) 
    else: 
     return count_it(target[1:], key)