gpt4 book ai didi

c - 在 C 语言中在运行时生成嵌套循环

转载 作者:行者123 更新时间:2023-12-04 10:24:02 25 4
gpt4 key购买 nike

关闭。这个问题需要details or clarity .它目前不接受答案。












想改善这个问题吗?通过 editing this post 添加详细信息并澄清问题.

去年关闭。




Improve this question




我知道使用递归方式,但它仅适用于循环,其中开始和结束语句与下面的代码相同

for (int i=1 ; i<5;i++){
for (int j=0; j<5;j++){
for (int m= 0;m<5;m++) {
// N time
}
}
}

但我的问题是不同的。我在编译时不知道 N 级和开始和结束语句。我将在运行时从用户那里学习它们。

喜欢:
for (int i=1 ; i<5;i++){
for (int j=5; j<18;j++){
for (int m= 4;m<5;m++) {
// N time
}
}
}

所以我的问题是:有没有办法在编译时不知道 N 的情况下为循环创建嵌套的 N 级?

最佳答案

您可以通过构造一些数据作为迭代器并将其视为迭代的单个事物来实现。该数据将为您希望迭代的每个维度包含一个单独的计数器,并且它将由本身在每个维度上迭代的函数进行初始化、测试和递增。这是一个使用简单数组作为计数器的示例。

#include <string.h>


// Initialize counters to their start values.
static void InitializeCounters(long N, long *Counters, const long *Starts)
{
memcpy(Counters, Starts, N * sizeof *Counters);
}


// Return 1 if there are more values to iterate, 0 otherwise.
static int MoreToIterate(long N, long *Counters, const long *Ends)
{
return Counters[0] < Ends[0];
}


// Increment the counters, lexicographic (dictionary/odometer) style.
static void IncrementCounters(long N, long *Counters, const long *Starts,
const long *Ends)
{
/* Increment each dimension (except the first will be special). If it
rolls over its end, reset it to its start and go on the next dimension.
If it does not roll over, stop there.
*/
for (long i = N-1; 0 < i; --i)
if (++Counters[i] < Ends[i])
return;
else
Counters[i] = Starts[i];

/* For dimension zero, do not reset it, so MoreToIterate can see it
finished.
*/
++Counters[0];
}


#include <stdio.h>
#include <stdlib.h>


static void _Noreturn Usage(char *argv[])
{
fprintf(stderr, "Usage: %s <N>\n", argv[0]);
exit(EXIT_FAILURE);
}

int main(int argc, char *argv[])
{
if (argc != 2)
Usage(argv);

char *end;
long N = strtol(argv[1], &end, 0);
if (*end != '\0')
Usage(argv);

if (N < 0)
Usage(argv);

long *Counters = malloc(N * sizeof *Counters);
long *Starts = malloc(N * sizeof *Starts);
long *Ends = malloc(N * sizeof *Ends);
if (!Counters || !Starts || !Ends)
{
fprintf(stderr, "Error, unable to allocate memory.\n");
exit(EXIT_FAILURE);
}

// Initialize start and end values as desired.
for (long i = 0; i < N; ++i)
{
Starts[i] = 0;
Ends[i] = i+1;
}

for ( InitializeCounters(N, Counters, Starts);
MoreToIterate(N, Counters, Ends);
IncrementCounters(N, Counters, Starts, Ends))
{
for (long i = 0; i < N; ++i)
printf("%ld ", Counters[i]);
printf("\n");
}

free(Ends);
free(Starts);
free(Counters);
}

使用参数“3”执行时的示例输出为:

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2

关于c - 在 C 语言中在运行时生成嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60708989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com