質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Q&A

解決済

2回答

3098閲覧

Python再帰関数で数字を分割して足す

_ryu_

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

0グッド

0クリップ

投稿2020/06/22 05:32

Python

1def recursiveDigitsSplitAdded(digits, total, sumUp): 2 if digits < 1 and total < 10: 3 return sumUp + total 4 elif digits < 1 and total >= 10: 5 return recursiveDigitsSplitAdded(total//10, sumUp+total%10, sumUp+total) 6 else: 7 return recursiveDigitsSplitAdded(digits//10, total+digits%10, sumUp) 8 9def recursiveDigitsAdded(digits): 10 11 return recursiveDigitsSplitAdded(digits, 0, 0) 12 13print(recursiveDigitsAdded(3528)) --> 27 14print(recursiveDigitsAdded(99999999999884)) --> 132

数字を一桁ずつ足していき、その合計値が一桁になるまで同じ処理を繰り返し、最後にそれぞれの合計値を返す処理になっています。
例:recursiveDigitsAdded(3528) 3 + 5 + 2 + 8 = 18 → 1 + 8 = 9 → 18 + 9 = 27
ただ、recursiveDigitsAdded(99999999999884)を実行するとエラーになります。
原因は、再帰処理の許容度を超えている為だと思います。
再帰関数でrecursiveDigitsAdded(99999999999884)を実行させるには条件式を見直すべきでしょうか?
自分では、改善案が思い付かないので質問させていただきました。
ご教授頂けると幸いです????‍♂️

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

今回のような桁数が大きな整数を渡すような場合は、文字列として扱った方がいいような気がします。

再帰の回数は今回の場合には問題ないと思います。
以下の例でもわずか3回程度です。

Python

1def recursiveDigitsAdded(digits, total): 2 dig_list = [int(i) for i in digits] 3 sub = sum(dig_list) 4 5 if sub < 10: 6 return sub + total 7 else: 8 total += sub 9 10 return recursiveDigitsAdded(str(sub), total) 11 12if __name__ == '__main__': 13 ans = recursiveDigitsAdded(str(99999999999884), 0) 14 print(ans) 15

投稿2020/06/22 07:14

編集2020/06/22 07:20
autumn_nsn

総合スコア335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_ryu_

2020/06/22 22:53

回答ありがとうございます。 内包表記を使う発想はありませんでした。 勉強になります。
otn

2020/06/23 01:00

内包表記を使うかどうかは本質じゃないです。 この回答は、 「数字の和を求める部分を再帰じゃなくてループにすることでプログラムを簡単にする」 ということです。 再帰にこだわらないなら簡単です。
guest

0

再帰回数は初期状態である程度の回数で制限されています。通常ならデフォルトは1000回。
変更するには、sys.setrecursionlimit(n)で上限n回まで変更できます。
ただし無制限にすることはできません。実行環境にもよりますが2,3万くらいでpython側がクラッシュします。

なので基本的にはこの設定に頼らないアルゴリズムを考える必要があるでしょう。
特にこの例では20000でも終わらないし。

この問題では再帰を使わずとも簡単に計算することが可能です。
whileでループさせましょう。
ヒントは、digitsを/10していくといつか0になるので、digitsが0になればwhileから抜けらるようにすればよいのです。

投稿2020/06/22 07:14

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_ryu_

2020/06/22 22:44

回答ありがとうございます。 sys.setrecursionlimit(n)で上限変更できることは知りませんでした。 ただ無制限にできないことに注意が必要なんですね。勉強になります。 whileを使った解き方考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問