#include <iostream>
using namespace std;
int main()
{
int range = 20;
int totalCombinations = 0;
for(int i=1; i<=range-2; i++)
{
if(range>i)
{
for(int j=1; j<=range-1; j++)
if(j>i)
{
for(int k=1; k<=range-1; k++)
if(k>j)
{
for(int l=1; l<=range-1; l++)
if(l>k)
{
for(int m=1; m<=range-1; m++)
if(m>l)
{
for(int f=1; f<=range; f++)
if(f>m)
{
cout << " " <<i<< " " <<j<< " " <<k<< " " <<l<< " " <<m<< " " <<f;
cin.get(); //pause
totalCombinations++;
}
}
}
}
}
}
}
cout << "TotalCombinations:" << totalCombinations;
}
答えて
あなたが行うことができます最初の事はusing continue
です:
for(int i=1; i<=range-2; i++) {
{
if(range<=i) {
continue;
}
for(int j=1; j<=range-1; j++) {
if(j<=i) {
continue;
}
//etc for all inner loops
}
}
この大幅に読みやすさを向上させるIMOネストを削減します。
これを行うことができます。または、完全に冗長なIFテストを排除することができます(私が指定したように...)。 +1はこれが問題をより一般的に解決するためですが、この特定のケースではより良い解決策が存在すると思います。 –
コードを読むことができず、維持することができません。最初のことは、Billy ONealが言ったことです:不要な 'if'を取り除くことです。 (それが価値あるものであれば、最初のものはいつも偽になるでしょう。) –
@ James Kanze:これらのチェックは不要ですが、私が提案するリファクタリングは正式に行うことができ、これらのチェックが不要であることに気付くのが簡単になります。 – sharptooth
if(range>i)
理由だけああ、私はそれを後方に持っていましたが、ポイントは立っています - これを簡単にリファクタリングしてrange
でi
を開始し、問題を回避しませんか?for
の条件の一部にすることができます。特別な条件の必要はありません。
if(j>i)
理由だけi
でj
を起動しませんか?半分のあなたのネスティングを取り除く
...(他の二つのループのために繰り返します)
。限り、ループ自体が行く、私はそれらの抽出メソッドを使用することをお勧めします。
+1:さらに、 'i'は常に' range'より小さくなります。 –
リファクタリングと同じ方法です。まず、 が何をしているのか把握しなければなりません。この場合、多くのテストは無関係であり、 の各ループは基本的に同じことを行います。より一般的な問題の具体的なケース(非常にうっすら)を解決しました。 を解決すると、問題の一般的なアルゴリズムはより洗練された簡単な ソリューションとなり、より一般的なソリューションとなります。このような何か:
class Combin
{
int m;
int n;
int total;
std::vector<int> values;
void calc();
void dumpVector() const;
public:
Combin(int m, int n) : m(m), n(n), total(0) {}
int operator()() { total = 0; values.clear(); calc(); return total; }
};
void
Combin::calc()
{
if (values.size() == m) {
dumpVector();
++ total;
} else {
values.push_back(values.empty() ? 0 : values.back() + 1);
int limit = n - (m - values.size());
while (values.back() < limit) {
calc();
++ values.back();
}
values.pop_back();
}
}
void
Combin::dumpVector() const
{
for (std::vector<int>::const_iterator iter = values.begin(); iter != values.end(); ++ iter)
std::cout << ' ' << *iter + 1;
std::cout << '\n';
}
int main()
{
Combin c(6, 20);
std::cout << "TotalCombinations:" << c() << std::endl;
return 0;
}
上記でコメントの本当に価値がある唯一の事はcalc
でlimit
の計算 であり、それは本当にただの最適化です。 n
を使用しても同じ結果が得られます(ただし、もう少し詳しく説明します)。あなたがあなたの元のバージョンでは、 ループの終了条件は、多かれ少なかれ任意であることに注意しましょう
:体系 仕事だろうか、limit
のために私が使用して式をうまくできrange
を使用して( う各ループごとに異なる終了条件での結果。また
は、私のコードはCと C++でubiquiousある半分開いた間隔を使用しています。私は、あなたがそれらに慣れたら、あなたはずっと 簡単にそれらを見つけることだと思います理由について。
My C++ i錆びているので、C#の例を挙げましょう。任意の数のネストされたループは、次のようにただ1つに置き換えることができます。
public void ManyNestedLoopsTest()
{
var limits = new[] {2, 3, 4};
var permutation = new[] {1, 1, 0};
const int lastDigit = 2;
var digitToChange = lastDigit;
while(digitToChange >= 0)
{
if (permutation[digitToChange] < limits[digitToChange])
{
permutation[digitToChange]++;
digitToChange = lastDigit;
PrintPermutation(permutation);
continue;
}
permutation[digitToChange--] = 1;
}
}
private void PrintPermutation(int[] permutation)
{
for(int i=0;i<3;i++)
{
Console.Write(permutation[i]);
Console.Write(" ");
}
Console.WriteLine(" ");
}
- 1. ネストされたスクロールペインのロジックのヘルプが必要
- 2. リファクタリング:Javascriptがこのコードをリファクタリングいくつかの助けが必要
- 3. コードのエラー(ヘルプが必要です)
- 4. JavaScriptのリファクタリングに関するヘルプが必要
- 5. BizTalkマッピング、要素のネストされたコレクション、必要なヘルプ
- 6. Rubyが深くネストされたJSON APIデータを取得する
- 7. wsdl2objc webserviceから生成されたObjective-Cコードのヘルプが必要です
- 8. 深くネストされたxsd要素からenumを生成
- 9. カンカン深くネストされたリソース
- 10. Angular2ルーティングv3.0.0、深くネストされたルート
- 11. 深くネストされたビジュアルツリーのドラッグアンドドロップアドバンテージ
- 12. 小規模コードのヘルプが必要
- 13. ボーイスカウト、JavaScriptコードのヘルプが必要
- 14. カスタマイズされたレポートに関するヘルプが必要
- 15. javascriptコードをjqueryに変換する(ヘルプが必要です)
- 16. オブジェクトにネストされたオブジェクトのキーを反復するにはヘルプが必要です。角度4つの
- 17. activerecordのネストされた結合が深く
- 18. imacroヘルプが必要です
- 19. ヘルプが必要です!
- 20. QuantLib:Garchヘルプが必要です
- 21. ネストされたScala先物にマネージブロックが必要ですか?
- 22. シリアル化されたXMLがあまりにもネストされている深く
- 23. jQueryで深くネストされた要素のIDを変更する方法
- 24. CSSはネストされた要素をNレベルまで深く選択します
- 25. 私のコードにページネーションアルゴリズムのヘルプが必要ですか?
- 26. JavaScriptヘルプが必要
- 27. LINQTOSQLヘルプが必要
- 28. ISBLANKヘルプが必要
- 29. Casbahで深くネストされたMongoDBオブジェクトをクエリする[Scala]
- 30. 深くネストされたJSON内でDictを作成する
は誤ってCとタグ付けされています。 – GENRO