【问题标题】:Execute a loop x times without loop or if statements在没有循环或 if 语句的情况下执行循环 x 次
【发布时间】:2015-04-23 07:36:30
【问题描述】:

如何重写以下程序以不使用任何循环和分支结构? (不,如果,同时,中断,继续,切换,...​​)

for(int i=0; i < 5; i++){
  // do stuff
}

我能想到的唯一方法是使用丑陋的 goto 语句:

loop:
  // do stuff
  goto loop;

但是我怎样才能在运行 5 次后退出这个循环呢?或者有什么不同的方法?

编辑:解决方案不应该是递归的。课程中还不允许调用函数。

【问题讨论】:

  • 你至少需要一个 if 和你的 goto 来模拟循环。
  • 是的://do stuff //do stuff //do stuff //do stuff //do stuff 。但是,它的重点是逃避我。
  • 请解释一下这个的用处...我的意思是你为什么不想使用循环和转到?
  • 说实话:这只是作业的一小部分。但我怀疑这甚至是可能的。 @amit 的答案当然有效,但实际上我需要 32 个。我认为这不是理想的方式。
  • 如果这是课程作业,那就太荒谬了。这应该教你什么?重复你想要的语句五次。

标签: algorithm loops goto


【解决方案1】:

您可以使用递归函数并将参数作为计数器传递。
每次调用前减少计数器。

int func(int a,int counter)
{
  int c;


  // .. your logic
  return counter==0?a:func(a,counter-1);      

}

return counter==0?a:func(a,counter-1); 这一行可以帮助你在不使用 if 的情况下处理 counter==0 时的条件。

【讨论】:

  • 对不起,我忘了补充说不允许递归调用,因为这应该稍后翻译成汇编程序,并且在赋值中还不允许函数调用。
  • 这个很智能,但是不行。 (至少在 C 中)error: expected expression before ‘goto’
  • 是的,注意到 .. goto 是一个声明...寻找替代方案
  • return 只能单独作为语句使用。
【解决方案2】:

您可以使用 foreach 循环:

// An array of ints with 5 values
int[] someNumbers = new int[] {0, 1, 2, 3, 4};

// Then foreach through someNumbers
foreach (int aNumber in someNumbers)
{
    // Do Stuff
}

这有点小技巧,但它可以正常工作,如果您想公开 someNumbers 并将其放在代码中的某个隐蔽空间中,这样就不会阻塞您的代码:)。

【讨论】:

  • 它可以工作,但 foreach 也是一个循环语句。 :(
【解决方案3】:

我发现这是不可能的。无论如何感谢您的回答!

【讨论】:

  • 是的。看看我的回答:)
【解决方案4】:

如果您使用的是 GCC,则可以使用“label as value”功能(也可以使用similar stuff in other compilers),如下所示:

#include <stdio.h>

int main() {
    int n, v, c;

    static void* labels[] = {&&nope, &&again};

    n = 5;
    again:
        printf("stuff\n");
        n--;
        goto *labels[__builtin_popcount(n&-n)];        
    nope:
        printf("done!\n");
    return 0;
}

此代码在n 中找到最低设置位(将其减少到只有一位,如果有的话)并对其进行popcount。在实践中,如果n==0 将返回 0,否则返回 1。如果不想依赖__buitin_popcount,可以自己实现,像这样:

int popcount(int v) {
    int c;
    c = (v & 0x55555555) + ((v >> 1) & 0x55555555);
    c = (c & 0x33333333) + ((c >> 2) & 0x33333333);
    c = (c & 0x0F0F0F0F) + ((c >> 4) & 0x0F0F0F0F);
    c = (c & 0x00FF00FF) + ((c >> 8) & 0x00FF00FF);
    c = (c & 0x0000FFFF) + ((c >> 16)& 0x0000FFFF);
    return c;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多