在没有循环或if语句的情况下执行循环x次

时间:2015-04-23 07:36:31

标签: algorithm loops goto

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

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

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

loop:
  // do stuff
  goto loop;

但是如何在5次运行后退出此循环?或者有不同的方式吗?

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

4 个答案:

答案 0 :(得分:1)

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

    [Route("user", Name = "first")]
    public ActionResult Index(string user)
    {
        return View();
    }
    [Route("company", Name = "second")]
    public ActionResult Index2(string company)
    {
        return View();
    }

此行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来处理条件。

答案 1 :(得分:0)

你可以使用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公开并把它放在代码的某个隐蔽空间中,所以它不会堵塞你的代码:)。

答案 2 :(得分:0)

我发现这是不可能的。无论如何,谢谢你的答案!

答案 3 :(得分:0)

如果您使用的是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或其他1,则返回0。如果您不想依赖__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;
}