タイムアウトやスタックオーバーフローになります
コードの実行には時間の上限があります。上限を超えると、処理そのものは正しくても不合格になります。再帰の深さにも言語ごとの上限があります。
タイムアウトになる場合
入力が小さいうちは通り、大きくなると落ちる場合は、計算量が足りていません。多いのは次の形です。
- 二重や三重のループで全ての組み合わせを調べている
- ループの中で毎回、配列全体を検索している
- 同じ計算を何度も繰り返している
配列の検索を毎回行っているなら、ハッシュマップに置き換えると大きく減らせます。同じ計算を繰り返しているなら、結果を保存して使い回してください。
スタックオーバーフローになる場合
Maximum call stack size exceeded や RecursionError が出る場合は、再帰が深くなりすぎています。原因は2つのどちらかです。
終了条件に到達していない。再帰の中で引数が変化していないと、いつまでも呼び出しが続きます。呼び出しのたびに引数が終了条件へ近づいているかを確かめてください。
入力が大きすぎる。終了条件は正しくても、入力の大きさによっては上限に達します。この場合は再帰をループに書き換えてください。
上限の引き上げについて
Pythonでは sys.setrecursionlimit() で再帰の上限を変えられますが、根本の解決にはなりません。深い再帰が必要な処理は、ループで書き直すほうが確実です。