メソッドフットプリントが、表示するフットプリントと正確に一致しなければならない場合は、実行できません。 String
を継承することはできませんし、2GBを超える新しいタイプを作り直すことができません。
入力値の最大値がであると仮定すると、フットプリントと一致する解決策を提供できます。例えば、n
の最大値が10000
かそれとも非常に小さいものであるかのように。
しかし、私は@MikeSamuelによって提案されているように、IEnumerable<char>
アプローチが、指定された要件に近づくように働く唯一の解決策であると考えています。
あなたは彼らのようなyield
構文を使用した溶液を探していました。このc# 4.0
ほとんどのタグを付けてきたように:あなたは、あなたが以下の
int input = 1000000000; // 1 billion.
foreach (var value in convtostr(input))
{
Console.Write(value);
}
ようにそれを使用することを説明することができ
static IEnumerable convtostr(int n)
{
for (int i = 1; i < n; i++)
yield return string.Format("{0}, ", i.ToString());
yield return n.ToString();
}
をそして、それはあなたが答えたいと思っていたものでしょう。これは、最終的な文字列全体を実際にはメモリに格納しないことで、非常に少ないアクティブRAMで動作するためです。
編集:@suddnely_meによって提案されたものと同様の別の答えは、次のような、代わりに各番号のアクションに渡すことです:
static void convtostr(int n, Action<int> action)
{
for (int i = 1; i <= n; i++)
action(i);
}
その後、使用して呼び出され、この:
int input = 1000000000; // 1 billion.
convtostr(input, n =>
{
if (n < input) { Console.Write("{0}, ", n); }
else { Console.Write(n); }
});
をどの実際にはyield
構文を使用するのとほぼ同じ動作をします。
のn = 10億:
'IEnumerable'? –
返事をありがとうが、これはインタビューの質問で私に尋ねられました。とにかく、オブジェクトを返す場合でも、反復される結果は依然として非常に大きくなります。だから、周りを回ることはありませんか、それは可能ではありません。 – Naphstor
@Naphstor:何かを取得しますか?あなたがそれを反復したいのであれば、あなたはそれを行うには長い時間がかかるでしょう。それを繰り返す必要がない場合は、実際には何もしないため、怠惰なアプローチは非常に速くなることは明らかです。 –