如何重写以下程序以便不使用任何循环和分支结构? (不,如果,同时,休息,继续,切换......)
for(int i=0; i < 5; i++){
// do stuff
}
我能想到的唯一方法是使用丑陋的goto语句:
loop:
// do stuff
goto loop;
但是如何在5次运行后退出此循环?或者有不同的方式吗?
编辑:解决方案不应该是递归的。课程中尚不允许进行函数调用。
答案 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;
}