2011-12-03 5 views
0

私はこのようなものがコードで使用できるかどうか疑問に思っていました。 プログラムの多くの部分で同じコードを実行したい場合は、 と同じですが、これはwhileループのこのバージョンを使用しましたが、これは機能しますか? 代わりにwhileループを書き出すwhileループは機能付きですか?

NSMutableArray *objects; 
-(void) RemoveObjectLoop 
{ 
    [self RemoveObjectAtZero]; 
} 

-(void) RemoveObjectAtZero 
{ 
    if([objects count] > 0) 
    { 
     [objects removeObjectAtIndex:0]; 
     [self RemoveObjectLoop]; 
    } 
} 

複数回だけ[RemoveObjectLoop自己]を行う(私は、whileループを使用することができることを承知していますが、私はこれが探求する面白いアイデアだと思いました)。 これはプロジェクトで使用できますか? これを使用したくないインスタンスがありますか?

編集:私はこの例が悪いことを知っています、私はちょうど他の何かを考えることができませんでした。 できる場合は、答えに例を含めてください。ありがとう!

+1

[yourObject removeAllObjects]を使用します。 – Aravindhan

+1

これは実用的な例ではないことは分かっていますが、実際は恐ろしいです。実際の質問にお答えください、ありがとう! :D – Telinir

+0

また、yourObjectの代わりに[yourArray removeAllObjects]を入れませんか? :P – Telinir

答えて

1

通常、再帰では、そのような循環関数呼び出しはありません。この関数は、結論に向けて作業中に自分自身を呼び出すだけです。だからあなたの例では、なる:

-(void) RemoveAll 
{ 
    if([objects count] > 0) 
    { 
     [objects removeObjectAtIndex:0]; 
     [self RemoveAll]; 
    } 
} 

(ロゴなど)いくつかの言語が自動的に(再帰呼び出しは、関数の最後の行である)末尾再帰を最適化します。私はObjective-Cのことを聞いたことがないし、もしそうならば驚くだろう。

通常、(あなたの質問は、あなたが指摘したように重要な点です)再帰の例が考案されており、非再帰的によく解決されます。 Here are some real-world examples of recursion

+0

それを説明し、例を挙げてくれてありがとう! – Telinir

+1

ようこそ。あなたがやっているプログラミングのタイプによっては、何回も再帰を使う必要がなくても何年もかかることがありますが、今のところ問題を解決するためには魔法のようにエレガントな方法ですので、ツールチェストに入れるのは良いことです。 – SSteve

3

これは再帰と呼ばれます。それを最適化しない言語では、最終的に関数に必要なフレームを保持するためにスタック領域が不足するため、適度なサイズのコレクションに対してのみ使用できます。通常のループよりもいくぶん遅くなります(コンパイラが最適化しない限り)。

一部のアルゴリズムでは、適切です。例えば、深さ優先探索は当然再帰関数として実装されます。しかし、私はこれがこれらのケースの一つだとは思わない。

+0

おかげでチャック!私は例が悪いことを知っています、ごめんなさい:D – Telinir

関連する問題