4

数値の桁の合計をカウントするコードを作成する必要があります。これらは問題の正確なテキストです。数値nのデジタル合計は、その桁の合計です。正の整数nを取り、そのデジタル合計を返す再帰関数digitalSum(n)を記述します。たとえば、2 + 0 + 1 + 9 = 12であるため、digitalSum(2019)は12を返す必要があります。これらは私が書いたコードです:

def digitalSum(n):
   L=[] 
   if n < 10:
      return n
   else:
      S=str(n)
      for i in S:
         L.append(int(i))
      return sum(L)

これらのコードは正常に機能しますが、再帰関数ではなく、intをstrに変更することは許可されていません。あなたは私を助けることができます?

4

10 に答える 10

10

これを試して:

def digitalSum(n):
    if n < 10 :
        return n
    return n % 10 + digitalSum( n // 10 )

編集:このアルゴリズムの背後にあるロジックは、再帰関数を呼び出すたびに、数値の最後の桁を切り捨てて合計に追加することです。最初に で最後の桁を取得しn % 10、次に関数を再度呼び出して、最後の桁を切り捨てた数値を渡します: n // 10。1 桁の数字になったときにのみ停止します。停止した後、再帰呼び出しが戻ると、桁の合計が逆の順序で計算されます。

数値 12345 の例:

5 + digitalSum( 1234 )
5 + 4 + digitalSum( 123 )
5 + 4 + 3 + digitalSum( 12 )
5 + 4 + 3 + 2 + 1 <- done recursing
5 + 4 + 3 + 3
5 + 4 + 6
5 + 10
15
于 2012-08-24T09:54:15.797 に答える
3

宿題なので、あまりコードを書いていません。再帰は、次の方法で使用できます。

  • 最初の (または最後の) 桁を取得する
  • 残りを短い数値としてフォーマットする
  • 数字と短い方の数のデジタル和を足す(再帰!)
于 2012-08-24T09:53:56.633 に答える
3

これは、アルゴリズムに関連する質問です。

これがあなたの答えです:

def digit_sum(a):
    if a == 0:
        return 0
    return a % 10 + digit_sum(a/10)

なぜ機能するのか理解できない場合はお知らせください。説明を提供します。

于 2012-08-24T09:56:55.500 に答える
1

いくつかのヒント:

  1. Pythonで内部関数を定義できます
  2. ここで、モジュラス演算子を使用して(その構文と使用法を調べて)効果を上げることができます
  3. 適切な再帰的ソリューションを使用して明示的なリスト表現を構築する必要はありません

編集上記は一般的な答えとしては少し「悪い」ですが、他の誰かが宿題以外のコンテキストでこの問題を抱えている場合はどうなりますか? その後、スタックオーバーフローは失敗します...

それで、これが私がそれをどのように実装するかであり、読み続ける必要があるかどうかを決定する必要があります. :)

def digitalSum(n):
  def process(n, sum):
    if n < 10:
      return sum + n
    return process(n / 10, sum + n % 10)
  return process(n, 0)

これは少し多すぎるかもしれませんが、学習状況であっても、1 つの答えにアクセスできることは有益です。

私の解決策はいくつかのものよりも冗長ですが、テールコール最適化コンパイラーに対してもよりフレンドリーです。これは機能だと思います。

于 2012-08-24T09:51:07.100 に答える
0
def digital_sum(number):
    if number < 10: 
        return number
    else:
        return number % 10 + digital_sum(number / 10) 
于 2012-08-24T09:57:37.180 に答える
-2

デフ drs_f(p):

 drs = sum([int (q) for q in str(p)])
 while drs >= 10:
     drs = sum([int(q) for q in str(drs)])
return drs
于 2012-08-24T19:32:14.237 に答える
-3
def digitalSum(n):
   if n < 10:
      return n
   else:
      return ???

最初の部分は、既存のコードからのものです。??? あなたが取り組む必要がある部分です。1 桁をn削除して、残りの桁の digitalSum に追加することができます。

は実際には必要ありませんがelse、コード構造が同じに見えるように残しました

于 2012-08-24T09:55:22.363 に答える