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

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

最近有一个问题,要实外汇交易策略的优化问题。问题很简单:配置n 个参数,这n 个参数都取一定的范围,找出最优的参数组合。

比如:

a  = [0, 10]  (从 0, 10, a 是整数)

b = [20, 30]

当然,解决方案很简单,用一个两个for 循环就可以了。就可以求出所有的组合情况了。

当然,问题的需求没有这样简单:

1. 参数可能会很多个,比如 有10个。这样循环会写的很难看。(深度太深)

2. 参数的个数不是固定的,可能是一个,也可能是两个,所以,你没有办法知道要写多少个循环。

 

循环问题,当然是分装成一个迭代器比较好。这样,业务逻辑,可以和循环可以分开了。

当然,这个问题很简单,最好大家先不要看答案,自己动手写一下。我总感觉我的解决方案

不是非常的完美。虽然,结构还是挺清晰的。

接口是这样的:

一个

begin 函数。迭代器初始化

next 函数。迭代过程。如果迭代结束,返回0

 

ExpandedBlockStart.gif 代码
#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  ==   - 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 ' );
    }
}

 

 

 

posted @ 2010-04-03 12:58 暮夏 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值