多重循环 如何 转换 成一个迭代器
最近有一个问题,要实外汇交易策略的优化问题。问题很简单:配置n 个参数,这n 个参数都取一定的范围,找出最优的参数组合。
比如:
a = [0, 10] (从 0, 10, a 是整数)
b = [20, 30]
当然,解决方案很简单,用一个两个for 循环就可以了。就可以求出所有的组合情况了。
当然,问题的需求没有这样简单:
1. 参数可能会很多个,比如 有10个。这样循环会写的很难看。(深度太深)
2. 参数的个数不是固定的,可能是一个,也可能是两个,所以,你没有办法知道要写多少个循环。
循环问题,当然是分装成一个迭代器比较好。这样,业务逻辑,可以和循环可以分开了。
当然,这个问题很简单,最好大家先不要看答案,自己动手写一下。我总感觉我的解决方案
不是非常的完美。虽然,结构还是挺清晰的。
接口是这样的:
一个
begin 函数。迭代器初始化
next 函数。迭代过程。如果迭代结束,返回0
代码
#include <stdio.h>
#define MAX_CYCLE_LEVEL 10
typedef struct Range
{
int start;
int end;
int step;
} Range;
typedef struct CycleIteratorResult
{
int items[MAX_CYCLE_LEVEL];
int n;
} CycleIteratorResult;
int CycleBegin(Range *r, int n, CycleIteratorResult *result)
{
int i;
int p = n - 1;
result->n = n;
for (i = 0; i< n; i++) {
result->items[i] = (r + i)->start;
}
result->items[p] = (r + p)->start - (r + p)->step;
return 0;
}
int CycleNext(Range *r, int n, CycleIteratorResult *result)
{
int p = n - 1;
while (p >= 0 && (result->items[p] += (r + p)->step) > (r + p)->end) {
result->items[p] = (r + p)->start;
p--;
}
if (p == -1) return 0;
return 1;
}
int main()
{
Range r[] = {{0, 3, 1}, {4, 7, 1}, {8, 20, 1}};
int n = sizeof(r) / sizeof (Range);
int m;
CycleIteratorResult result;
CycleBegin(r, n, &result);
while(CycleNext(r, n, &result))
{
for (m = 0; m < result.n; m++)
{
printf("%d ", result.items[m]);
}
putchar('\n');
}
}
#define MAX_CYCLE_LEVEL 10
typedef struct Range
{
int start;
int end;
int step;
} Range;
typedef struct CycleIteratorResult
{
int items[MAX_CYCLE_LEVEL];
int n;
} CycleIteratorResult;
int CycleBegin(Range *r, int n, CycleIteratorResult *result)
{
int i;
int p = n - 1;
result->n = n;
for (i = 0; i< n; i++) {
result->items[i] = (r + i)->start;
}
result->items[p] = (r + p)->start - (r + p)->step;
return 0;
}
int CycleNext(Range *r, int n, CycleIteratorResult *result)
{
int p = n - 1;
while (p >= 0 && (result->items[p] += (r + p)->step) > (r + p)->end) {
result->items[p] = (r + p)->start;
p--;
}
if (p == -1) return 0;
return 1;
}
int main()
{
Range r[] = {{0, 3, 1}, {4, 7, 1}, {8, 20, 1}};
int n = sizeof(r) / sizeof (Range);
int m;
CycleIteratorResult result;
CycleBegin(r, n, &result);
while(CycleNext(r, n, &result))
{
for (m = 0; m < result.n; m++)
{
printf("%d ", result.items[m]);
}
putchar('\n');
}
}