1

「if」ステートメントを使用するとかなり冗長になる再帰を使用して問題を解決しようとしています。CONST = 50 が n に含まれる回数を調べています。n に 50 が含まれる出現回数を返したい。私はそれが簡単であることを知っていますが、これを達成するために再帰を使用したいのですが、それは私には簡単ではありません。条件は次のようなものです。

0 < n == 50 -> 1 instance
50 < n <= 100 -> 2 instance
100 < n <= 150 -> 3 instance
150 < n <= 200 -> 4 instance
200 < n <= 250 -> 5 instance
...
...
...

以下は私が始めたものですが、行き詰まりました:

def num_of_times(n)
""" (int) => int 
when n is entered count 1 for every 50 found. If any number is over 50, yet does not
equal another 50 (e.g. n = 60; 60 - 50 = 10; 50 -> 1; 10 -> 1) will call for a count, which would be a count of 2 in this case.

>>>num_of_times(60)
2
>>>num_of_times(200)
4
"""
    count = 0

    if n > 0 and n == 50:
        count += 1
    elif n > 50:
       """ Here is where my thinking is going to sleep"""
       ...
       ...
       ...

提供されたヘルプに事前に感謝します。

4

3 に答える 3

2

この特定の問題については、除算を使用する必要があります。

count = n // 50 + 1  

(単なる「/」の代わりに二重スラッシュを使用していることに注意してください。これにより、Python 3 でも整数除算が実行され、結果として浮動小数点値が得られる代わりに、結果が丸められます)

さて、再帰について-Pythonで問題を解決するための推奨される方法ではありません-スキームのように、「関数呼び出し用に最適化された」言語の反復的な「forループ」と同じコストを持つ可能性のある再帰関数は、対処する方が適切ですforまたはwhileループ。

この例を維持し、再帰につながるように、データ入力と各反復での結果の両方を変更する必要があります。これにより、データがロガー処理を必要としない場合、最終結果が得られます。

count = 0
while n >= 50:
   count += 1
   n -= 50

ここから、再帰的アプローチが何をすべきかを確認するのは簡単です: 連続する各呼び出しは、前の繰り返しよりも "n" と "count" の変更された値を受け取る必要があります。関数への最初の呼び出しで「count」パラメーターを追加する必要がないように、Python のオプションのパラメーター構文を利用できます。

def num_of_times(n, count=0):
    if n < 50:
        return count
    return num_of_times(n - 50, count + 1)

これは、Python では n = 約 50000 に制限されています。これは、インタープリターに設定された呼び出しスタックの深さと、デフォルトの最大再帰深度が 1000 に設定されているためです。sys モジュールで設定することでその数を変更できますが、それは定義されていません。 Python で推奨されるアプローチ - 関数呼び出しのオーバーヘッドと、whieandfor構造のより高いレベルの機能の両方について。ファイルへのパスや URL 部分などを処理する関数など、2 回から 100 回再帰する一部の関数では明らかに問題ありません。

于 2013-04-08T17:29:34.013 に答える
1

再帰はこれを行うにはあまり役に立たない方法のようですが、再帰が必要な場合は、これを試してください:

def num_of_times(n):
    if n > 0 and n <= 50:
        return 1
    elif n > 50:
        return 1+num_of_times(n - 50)
    else:
        return 0
于 2013-04-08T17:32:21.280 に答える
0

どうですか。

def num_of_times(n):
    if n < 50:
        return 0
    return 1 + num_of_times(n - 50)

あなたが求めている結果が50のすべてのdvisableに対して1ではなく、実際には1と50の間= 1、51と100の間= 2などの場合、

def num_of_times(n):
    if n <= 0:
        return 0
    elif n < 51:
        return 1
    return 1 + num_of_times(n - 50)
于 2013-04-08T17:33:48.173 に答える