zoukankan      html  css  js  c++  java
  • 多重循环 如何 转换 成一个迭代器

    最近有一个问题,要实外汇交易策略的优化问题。问题很简单:配置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');
        }
    }
  • 相关阅读:
    POJ 3683 Priest John&#39;s Busiest Day (2-SAT+输出可行解)
    Codeforces #2B The least round way(DP)
    避免死锁的银行家算法C++程序实现
    源代码编译安装MySQL5.6.12具体过程
    Android 设计模式
    Java与设计模式-适配器模式
    Java和Flex整合报错(五)
    三层架构—再思考
    怎样让DBGrid在按住Shift点鼠标的同时能将连续范围的多行选中?
    找出你的短板
  • 原文地址:https://www.cnblogs.com/niniwzw/p/1703654.html
Copyright © 2011-2022 走看看