2012-04-17 7 views
2

私はRubyとプログラミング全般を学んでいます。私は最初のプロジェクトとしてブラックジャックプログラムに取り組んでいます。私はstart_gameというメソッドを持っています。このメソッドは新しいハンドをすべて起動するために呼び出されます。このメソッドは呼び出され、ハンドが終了すると再び呼び出されます。これを行う正しい方法ですか?これは、メソッドが呼び出されるたびに無限にメモリを割り当てるように思えます。私はこれがガベージコレクションが処理するかどうかわからない。私はおそらくこれを行うためのより良い方法があるように感じるが、それを理解することはできない。前もって感謝します!Rubyでの再帰。私はこれを正しくしていますか?

+1

"私はstart_gameメソッドのコードを含んでいます。" - あなたはしていません。 –

+0

おっと!それを編集するのを忘れました。今修正されました。私はそれが価値がないと思った。 – Kevin

+0

ほとんどの場合、* some *コードを含める価値があります。このトリックは関連ビットを含めることができます。もし私があまりにも多くを含む面で間違っていると確信が持てないなら(例えば、ページ全体の長いプログラムを貼りつけないでください。誰もそれを読んでいません) – Russell

答えて

1

このように再帰的にメソッドを呼び出すと、スタックがオーバーフローすることになります(十分な手がプレーされているかどうかはわかりません)。

テールコールの最適化によって、これが発生しない限り、これは、再帰呼び出しがであり、いつでも最後のものがとなる再帰的メソッド呼び出しに適用できる最適化の形式です。これは基本的に再帰呼び出しをループに変換するので、毎回スタックに追加されることはありません。

しかし、このquestionによれば、Rubyでテールコールの最適化に頼ることはできません。だからあなたのコードを少し書き直すので、続けるべきかどうかを判断するためにいくつかの条件をテストするループでstart_gameが呼び出されます。

+0

ありがとうラッセル!私はそれを試してみましょう。 – Kevin

+1

問題ありません! Rubyの学習をお楽しみください - あなたはプログラミングを学ぶための良い言葉を選んでいます。 – Russell