【问题标题】:Rewriting code with many nested loops用许多嵌套循环重写代码
【发布时间】:2017-05-21 22:11:39
【问题描述】:

我想知道您是否可以递归地编写这样的东西或使用不同的循环系统:

std::string a = "00000000";
for (int i = 0; i<8; i++) {
    a[i] = '1';
    for (int j = 0; j<8; j++) {
        if (i!=j) {
            a[j] = '1';
            ... //more for loops with the same structure
            std::cout<<a[j]<<"\n";
            a[j] = '0';
    }
    a[i] = '0';
}

我正在尝试在不使用任何库的情况下打印出所有可能的 0 和 1 八位组合(如果必须的话,除了 bitset)。如果我这样做,我最终会得到 8 个 for 循环,这有点多。我想知道是否有一种方法可以使用递归或使用标准 do/while/for 循环的巧妙技巧来压缩它。

【问题讨论】:

  • 我看不出该代码应该做什么,但 recursion 几乎总是一个坏主意。
  • 尾递归理论上和迭代一样高效,但 gcc 并没有对其进行优化。 Clang 可以。

标签: c++ recursion combinations


【解决方案1】:

这个任务可以通过一个简单的 for 循环和二进制操作来完成。 将 i 位移一个量,然后将 &amp; 位移 1 以屏蔽该位。

#include <iostream>
void printBinary()
{
    for(int i = 0; i < 256; i++){
        for(int bit = 7; bit >= 0; bit--){
            std::cout << (i >> bit & 1);
        }
        std::cout << std::endl;
    }
}

【讨论】:

  • 非常优雅的解决方案,甚至没有使用std::bitset
  • 一般来说,如果你有一个从 ab 的循环,其中包含从 cd 的循环,你可以将它们展平成一个从 acbd。这里,a = 0、b = 8、c = 0、d = 8。
【解决方案2】:

首先,您的循环不正确:它们从 0 到 7(含)运行,而它们应该从 0 到 1(含)运行,因为位不是零就是一。

就遍历所有 8 位组合而言,您可以使用单个循环来完成:使用从 0 到 255 的 int 计数,并打印其二进制表示:

for (int i = 0 ; i != 256 ; i++) {
    cout << bitset<8>(i).to_string() << endl;
}

【讨论】:

  • 我的循环很好,因为我已经尝试了完整的八个循环,你确实得到了想要的(相当混乱的)输出。不过,我非常感谢您的其他解决方案!非常聪明。我不敢相信我以前没有想到这一点。
  • @LinusRastegar 我想我明白你做了什么:下一个循环中的每个if 变得越来越复杂,对吧?不过,八个嵌套循环和很多 ifs 这样的东西很难写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
相关资源
最近更新 更多