多重循环 如何 转换 成一个迭代器
最近有一个问题,要实外汇交易策略的优化问题。问题很简单:配置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 ' );
}
}