2016-06-01 9 views
2

に入れ替えましたカテゴリNSStringの逆戻りの逆転のために逆の方法で逆転させました。私は正しい答えを得ている。しかし、もしこれが大丈夫なら、私はメモリ管理で分かりません。私はObjective-Cのメモリ管理についてよく知らない。NSStringを再帰的にカテゴリ

これ以外の効率的な方法は非常に賞賛に値するでしょう。ここで私は再帰でそれを実装していますので、

-(NSString *)reverseString{ 
    if ([self length]<2) { 
     return self; 
    } else { 
     return [[[self substringFromIndex:1] reverseString] stringByAppendingString:[self substringToIndex:1]]; 
    } 
} 

しかし、この質問はReverse NSString textではなく、重複と類似しています。そして、私は具体的にどのコード例でもないメモリ消費量について尋ねました。

+0

長い文字列(数千文字)を反転しようとするとスタックオーバーフローが発生する可能性があります。そして、あなたのコードは、複数の文字としてエンコードされているUnicode文字を含む不正な文字列を生成します。 – rmaddy

+0

正直なところ、この再帰的アルゴリズムを使用することはおそらく、文字列を逆転させる最も有用な方法の1つです。 Sanjitによってリンクされた複製は、このアルゴリズムよりはるかに優れたアプローチをしています。 – rmaddy

+1

ただ楽しむために、絵文字を含む文字列を逆にしてみてください。書かれているように、スペースと所要時間はO(n^2)です。ここで、nは元の文字列の長さです。 100,000文字の文字列は、Macを膝に持っていくでしょう。 – gnasher729

答えて

2

再帰を使用して文字列を反転させることは興味深い考え方ですが、非常に遅くて恐ろしいメモリの無駄遣いになっています。 2nの一時的な文字列を作成する必要があります。 (nは文字列内の文字数)これらの文字列のnは1文字だけで、他のn文字列は1,2,3,4,5などです。文字数はn-1までです。

(メモリ割り当てが非常に遅い)

さらに、n個のスタックフレームを作成します。 rmaddyさんのコメントによれば、非常に長い文字列に対してスタックオーバーフローが発生する可能性があります。

あなたが再帰について学ぶためにこれを行っているならば、大丈夫です。さもなければ、このアプローチを完全に投げて、配列を逆向きにループするコードを書いて、各文字を可変文字列に追加してください。

+0

私はボンネットの下にあるものを理解してくれてありがとう。あなたが言ったように私は思うことができませんでした。私の質問に対する非常に説明的な答え。そして、はい、私はObjective-Cの学習を始めました。だから、「基本的な再帰はどうですか?」と思って、これで終わりました。 – nayem