再帰操作が必要な状況に遭遇しましたが、再帰の回数は非常に多く、10,000回を超えていました。 10,000 回を超える再帰については話さないでください。元のテスト コードは Java にあります。JDK やコンパイル環境はインストールされていません。まず、元の Java コードを見てみましょう。あまり Java で遊んだことはありませんが、これらのコード行はストレスフリーなようです。混乱をすぐに解消して、Python コードに変更しましたpublic class UpCount {
private long calc(int depth) {
if (depth == 0) return 1;
long cc = calc(depth - 1);
return cc + (depth % 7) + ((((cc ^ depth) % 4) == 0) ? 1 : 0);
}
public static void main(String[] args) {
UpCount uc = new UpCount();
System.out.println(uc.calc(11589));
}
}
。コードを貼り付けて、F5 キーを押すと問題が発生しました
整数
を直接使用できるので、それがlongと何か関係があるとは思えません
もちろん、実際には、それはlongとは何の関係もありません
def calc(depth): if depth == 0: return 1 cc = long(calc(depth-1)) xor_mod = (cc ^ depth)%4 if xor_mod == 0: return cc+(depth%7)+1 else: return cc+(depth%7) number = long(calc(11589)) print number上記のコードは、10 進数の長い文字列を 16 進数に変換することもできます。 8進数と16進数に変換できます。 oct()、hex() 以上です。ユークリッド割り算を使って解いてみましょう
以上で、数値の大きさに誤差がないことがわかります。すべて、11589 は、今日のコンピューター、2^16 と 65536 にとっては朝飯前のことです
実際、ここで、前回の再帰エラーの本当の理由が言及されていないことに気づき、その理由に疲れ果てました。再帰エラーは、Python のデフォルトの再帰制限は約 1,000 回のみですが、ここでは 10,000 回以上実行する必要があるということです。更新に時間がかかりました: Run
time
本来の目的は評価するだけなので、深く勉強する必要はありません、使用しましょうあまり感銘を受けませんが、コードは次のとおりです:
cimal = 7 original = 28679718602997181072337614380936720482949 array = "" result= "" while original !=0: remainder = original % cimal array += str(remainder) original /= cimal length = len(array) for i in xrange(0,length): result += array[length-1-i] print resultほんの数行のコードで、すぐに完了しました。前回のインタビューのことを思い出して、tx のインタビュアーがアルゴリズムについて質問したのですが、そのとき彼は、再帰を使用して演算を実装することについて言及していました。それで、反復も使用できるのではないかと考えました。
かなり前のことなので、当時の質問ははっきりとは思い出せませんが、今日の教訓は次のとおりです。ほとんどの場合 (コードの作成量が少なく、感覚に基づいて推定)、再帰の効率は比較的低いです。確かに、授業でも言われました。反復を使用する方が、再帰よりも明らかに効率が高くなります (反復の具体的な概念ははっきりとは覚えていません) 少なくとも、私は
loopを使用することで、何十万回の操作を行っても問題はないと確信しています。ただし、再帰制限を変更しても、やはりストライクに遭遇しました
最後に、Python Long VS C Long Long への別のリンクを掲載しますので、興味のある方はチェックしてみてください。
以上がPythonの反復法と再帰法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。