2013-06-27 8 views
7

OK、私は、Python 2.7.3を使用して、ここに私のコードですよ:再帰におけるグローバル変数。 Pythonの

def lenRecur(s): 

    count = 0 

    def isChar(c): 
     c = c.lower() 
     ans='' 
     for s in c: 
      if s in 'abcdefghijklmnopqrstuvwxyz': 
       ans += s 
     return ans 

    def leng(s): 
     global count 
     if len(s)==0: 
      return count 
     else: 
      count += 1 
      return leng(s[1:]) 

    return leng(isChar(s)) 

私はleng関数内の変数countを変更しようとしています。ここで私が試したものは以下のとおりです。

  1. 私はそれがうまく初めての作品lenRecur関数の外で変数countを入れて、私はPythonシェルを再起動せずに再度お試しあれば、カウント数(当然)」はdoesnの場合再起動しないので、追加を続けます。
  2. の行をcount = 1に変更しても動作しますが、出力は(明らかに)1になります。

ここで私の目標は、再帰を使用して文字列の長さを取得することですが、文字の数を追跡する方法はわかりません。私はグローバル変数に関する情報を探しましたが、私はまだ固執しています。私はまだそれを理解していないかどうか、私のコードに問題があるかどうかはわかりません。

ありがとうございます!

+0

は再帰自体を見ることができません。 – oleg

+0

申し訳ありません、今は大丈夫です! –

答えて

12

countlenRecurは、ではありません。グローバルです。これはスコープ付き変数です。

このようにするには、Python 3を使用する必要があります。あなたの代わりにcountためnonlocal statementは、Python 2でのPython 3に

を追加するために探して、あなたは(そのようなリストのような)ミュータブルを使用することで、この制限を回避することができません。

def lenRecur(s): 

    count = [0] 

    # ... 

    def leng(s): 
     if len(s)==0: 
      return count[0] 
     else: 
      count[0] += 1 
      return lenIter(s[1:]) 

今、あなたは何です名前自体を変更してください。それは変わらず、同じリストを参照し続けます。あなたがやっているのは、最初の要素をリストに入れたを変更することだけです。

代替「スペル」はcount関数属性を作るために次のようになります。

def lenRecur(s): 

    # ... 

    def leng(s): 
     if len(s)==0: 
      return leng.count 
     else: 
      leng.count += 1 
      return lenIter(s[1:]) 

    leng.count = 0 

countはもはやlenRecur()にローカルではありません。代わりに不変のlenRecur()関数の属性となっています。

あなたの特定の問題については、実際には物事を考えすぎています。ただ、加算ん再帰をしている:

def lenRecur(s): 
    def characters_only(s): 
     return ''.join([c for c in s if c.isalpha()]) 

    def len_recursive(s): 
     if not s: 
      return 0 
     return 1 + len_recursive(s[1:]) 

    return len_recursive(characters_only(s)) 

デモ:あなたはグローバル変数としてそれを使用したい場合は

>>> def lenRecur(s): 
...  def characters_only(s): 
...   return ''.join([c for c in s if c.isalpha()]) 
...  def len_recursive(s): 
...   if not s: 
...    return 0 
...   return 1 + len_recursive(s[1:]) 
...  return len_recursive(characters_only(s)) 
... 
>>> lenRecur('The Quick Brown Fox') 
16 
+0

Python 2.7でこれを行う方法はありますか? –

+0

または 'leng'関数のパラメータとしてcountを渡すことができます – oleg

+0

それは私のために働いた!リストが正常に動作するのはなぜですか? –

0

は、すべての関数定義の外にそれを定義します。

count = 0 
def lenRecur(s): 

かをそれを関数属性として定義します。

def lenRecur(s): 
    lenRecur.count = 0 
    def isChar(c): 

これはpy3で修正されています。x nonlocalステートメントを使用することができます。

def leng(s): 
    nonlocal count 
    if len(s)==0: 
+0

私はそれが関数の外側にある場合は、私が試したと言った最初の文lenRecurです。とにかくありがとう! –

+0

@CarlesMitjans私はその細部を逃したと思います。それを関数属性として定義することができます。 –

+0

心配しないでください:)答えてくれてありがとう! –

0

あなたはカウントが必要ありません。以下の機能が動作するはずです。

私はあなたがこのような自体がために変更可能なオブジェクト( listまたは dict)またはサルのパッチ適用機能を使用して、外側のスコープからオブジェクトをミュートより良い動作するはず

def anything(s): 
    def leng(s, count): 
     if not s: 
      return count 
     return leng(s[1:], count + 1) 

    return leng(isChar(s), 0) 

2番目の引数として数え渡すことができると思い

 

    def leng(s): 
     if not s: 
      return 0 
     return 1 + leng(s[1:]) 
 
+0

こちらもお試しください!ありがとう!! –

4

例。あなたは変数が

def lenRecur(s): 
    lenRecur.count = 0 

のような関数の変数を数えるようにする必要があり

+0

おっと!それについて考えなかった。ありがとう! –

+0

私は同じ回答を投稿しました。あなたのポストはそこに見えませんでした。私はいつものように遅くなったと思う:-) – thiruvenkadam

+2

コメントするのではなく、私のソリューションに投票するほうがいいです;) – oleg

1

はしかし、私はコードでいくつかの問題を参照してください。

1)あなたは再帰を通じて、文字列にアルファベットの数を見つけようとしている場合は、この1つが行います。

def lenRecur(s): 
    def leng(s, count = 0): 
      if not s: 
        return count 
      else: 
        count += int(s[0].isalpha()) 
        return leng(s[1:], count) 
    return leng(s) 

しかし、まだ、私はそこのように、タスクを実行するための単一の機能を有する好むだろう何の方法もありません。

2)あなたの目標は、単なる文字列にアルファベットの数を見つけることであるならば、私はリスト内包

def alphalen(s): 
    return sum([1 for ch in s if ch.isalpha()]) 

を好むだろう、これは目的を学習以外のものであれば、私はあなたが再帰を避けるためにお勧めします。なぜなら、解決策は大きな文字列(たとえば、ファイルの内容からアルファベット数を見つけること)には使用できないからです。 RunTimeError of Maximum Recursion Depth Exceededをヒットする可能性があります。

setrecursionlimit関数を使用して再帰深度を設定することでこれを回避することはできますが、他の簡単な方法に進むことをお勧めします。 recursionlimitの設定に関する詳細はhereです。