2016-11-08 13 views
0

おそらくコードネームの "永続的なバグ"タスクを解決しようとする人がいるかもしれません。だからここ は私の番です:)python:再帰関数カウンタ。永続性の問題

def persistence(num): 
    multi = 1 
    while num: 
    multi *= num % 10 
    num /= 10 
    global count 
    count += 1 
    if(multi >= 10): 
    persistence(multi) 
    else: 
    return 0 
    return count 
count = 0 
print(persistence(39)) 
#print(persistence(25)) 

それは私に正しい反復結果と1つの試みの成功した結果を提供します。 (persistence(39) => 3 # Because 3*9 = 27, 2*7 = 14, 1*4=4)しかし、グローバル変数を使用しているため、実行できません。これは1回以上です。これに対処する方法は?どのようにしてカウンタを作成できますか?この時点でこの関数を再帰的に使用しますか?あなたが状態を管理する必要がある場合は、再帰で

+1

私はあなたが関数がやっているしているかわからないんだけど、私はあなたがマルチ( '永続性を返すようにしたいとしている推測しています) 'を呼び出すのではなく、また、カウントを維持する必要がある場合は、グローバルを呼び出すのではなく、2番目の引数として渡すことができます。 'def persistence(num、count):' – Hoopdady

+0

私はその「仕事」に精通していないので、達成しようとしていることを教えてください。 – wheaties

+0

ここでは質問です:肯定的なパラメータnumを取り、その乗法的な持続性を返す関数、永続性を書く。これは、数字の1桁に達するまでnumの桁数を掛けなければならない回数です。 'persistence(39)=> 3'、' persistence(25)=> 2'です。だから私は 'カウント'を返すべきです。私の場合、私はグローバル変数を使用します。それでカウンターが常に増え、ちょうど2ではなく2番目に5(3 + 2)が出ます。 – ascentman

答えて

1

は、あなたは、関数の引数の中でそれを管理する:あなたが効果的に機能するために一つのインタフェースを提示している

def persistence(num): 
    #here is your code, slightly modified. 
    def _persist(num,count=0): 
    multi = 1 
    while num: 
     multi *= num % 10 
     num /= 10 
    if(multi >= 10): 
     return _persist(multi,count+1) 
    else: 
     return count 
    return _persist(num) 

が、あなたは本当に再帰的にそれを呼んでいますvia _perist

+0

この外部関数は何かを返しますか? – ascentman

+0

@ascentmanはい、あなたは彼の質問に書いたのと同じコードをネストします。したがって、 '_persist'は' count'を返します。 – wheaties

+0

私は得ることができませんが、結果として私は得る: "1"と "1"。私はまた、「カウント」のグローバルな定義を削除しました。内部関数を呼び出した後は、常にcount(ゼロ)のデフォルト値が使用されます。 – ascentman

2

あなたの試行は良いですが、アプローチはかなり素朴で、その小さな欠陥があります。 globalを使用して、関数の再帰呼び出し間のカウントを維持することは、その後の新しいと同じカウント変数を使用するという問題を伴います。呼び出し。それがあなたが現在その問題を抱えている理由です。

代わりに、返された値を1だけインクリメントし、最後の呼び出しで0を返すことで、関数が再帰を行う回数をカウントすることができます。最後のカウントは、すべての再帰呼び出し後の累積カウントです。ここで

operator.mulfunctools.reduceでそれを行うための一つの方法です:

from functools import reduce 
import operator 

def persistence(num): 
    if len(str(num)) == 1: 
     return 0 
    val = reduce(operator.mul, map(int, str(num))) 
    return 1 + persistence(val) 

print(persistence(39)) 
# 3 
print(persistence(25)) 
# 2 
+0

は、あなたが数えなくてもいいように定義されています... – Copperfield

+0

@Copperfield Thanks。それは* retrofitting *の呪いです –