多重循环 如何 转换 成一个迭代器

最近有一个问题,要实外汇交易策略的优化问题。问题很简单:配置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;
    
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 == -1return 0;
    
return 1;
}

int main()
{
    Range r[] 
= {{031}, {471}, {8201}};
    
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');
    }
}

 

 

 

posted @ 2010-04-03 12:58  暮夏  阅读(589)  评论(0编辑  收藏  举报