发散思维能力 求1+2+3+...+n

       发散思维的特点是思维活动的多向性和交通性,也就是我们在思考问题时注重运用多思路、多方案、多途径地解决问题。对于同一个问题,我们可以从不同的方向、侧面和层次,采用探索、转换、迁移、组合和分解等方法,提出多种创新的解法。

        问题:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)通常有三种解法:公式n(n+1)/2,递归和循环

// ====================方法一:利用构造函数求解====================
class Temp
{
public:
    Temp() { ++ N; Sum += N; }

    static void Reset() { N = 0; Sum = 0; }
    static unsigned int GetSum() { return Sum; }

private:
    static unsigned int N;
    static unsigned int Sum;
};

unsigned int Temp::N = 0;
unsigned int Temp::Sum = 0;

unsigned int Sum_Solution1(unsigned int n)
{
    Temp::Reset();

    Temp *a = new Temp[n];
    delete []a;
    a = NULL;

    return Temp::GetSum();
}

// ====================方法二:利用虚函数求解====================
class A;
A* Array[2];

class A
{
public:
    virtual unsigned int Sum (unsigned int n) 
    { 
        return 0; 
    }
};

class B: public A
{
public:
    virtual unsigned int Sum (unsigned int n) 
    { 
        return Array[!!n]->Sum(n-1) + n; 
    }
};

int Sum_Solution2(int n)
{
    A a;
    B b;
    Array[0] = &a;
    Array[1] = &b;

    int value = Array[1]->Sum(n);

    return value;
}

// ====================方法三:利用函数指针求解====================
typedef unsigned int (*fun)(unsigned int);

unsigned int Solution3_Teminator(unsigned int n) 
{
    return 0;
}

unsigned int Sum_Solution3(unsigned int n)
{
    static fun f[2] = {Solution3_Teminator, Sum_Solution3}; 
    return n + f[!!n](n - 1);
}

// ====================方法四:利用模板类型求解====================
template <unsigned int n> struct Sum_Solution4
{
    enum Value { N = Sum_Solution4<n - 1>::N + n};
};

template <> struct Sum_Solution4<1>
{
    enum Value { N = 1};
};

template <> struct Sum_Solution4<0>
{
    enum Value { N = 0};
};

// ====================测试代码====================
void Test(int n, int expected)
{
    printf("Test for %d begins:\n", n);

    if(Sum_Solution1(n) == expected)
        printf("Solution1 passed.\n");
    else
        printf("Solution1 failed.\n");

    if(Sum_Solution2(n) == expected)
        printf("Solution2 passed.\n");
    else
        printf("Solution2 failed.\n");

    if(Sum_Solution3(n) == expected)
        printf("Solution3 passed.\n");
    else
        printf("Solution3 failed.\n");
}

void Test1()
{
    const unsigned int number = 1;
    int expected = 1;
    Test(number, expected);
    if(Sum_Solution4<number>::N == expected)
        printf("Solution4 passed.\n");
    else
        printf("Solution4 failed.\n");
}

void Test2()
{
    const unsigned int number = 5;
    int expected = 15;
    Test(number, expected);
    if(Sum_Solution4<number>::N == expected)
        printf("Solution4 passed.\n");
    else
        printf("Solution4 failed.\n");
}

void Test3()
{
    const unsigned int number = 10;
    int expected = 55;
    Test(number, expected);
    if(Sum_Solution4<number>::N == expected)
        printf("Solution4 passed.\n");
    else
        printf("Solution4 failed.\n");
}

void Test4()
{
    const unsigned int number = 0;
    int expected = 0;
    Test(number, expected);
    if(Sum_Solution4<number>::N == expected)
        printf("Solution4 passed.\n");
    else
        printf("Solution4 failed.\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    Test1();
    Test2();
    Test3();
    Test4();

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
现代优化算法 现代优化算法 禁忌搜索算法 模拟退火算法 遗传算法 人工神经网络 蚁群算法 粒子群算法 混合算法 …………… 特点: 基于客观世界中的一些自然现象; 建立在计算机迭代计算的基础上; 具有普适性,可解决实际应用问题。 97年A 题用模拟退火算法 00年B 题用神经网络分类算法 01年B 题这种难题也可以使用神经网络 美国89年A 题也和BP(Error Back Propagation) 算法有关系 美国03年B 题伽马刀问题也是目前研究的课题,目前算法最佳的是遗传算法。 最优化理论的三大非经典算法: 模拟退火法(SA)、遗传算法(GA)、神经网络(NN) 近几年的赛题越来越复杂,很多问题没有什么很好的模型可以借鉴, 于是这三类算法很多时候可以派上用场。 最优化问题(Optimization Problem) 最优化问题: 1 2 1 2 ( ) ( , , , ) ( , , , ) n n Minimize f x f x x x subjectto x x x x S X 组合优化问题(Combinatorial Optimization Problem ) : 最优化问题中的解空间X或S由离散集合构成。其中很多问题是NP完全 (Nondeterministic Polynomial Completeness)问题. 待解决的问题 连续性问题,以微积分为基础,规模较小 传统的优化方法 理论上的准确与完美,主要方法:线性与非线性规划、动态 规划、多目标规划、整数规划等;排队论、库存论、对策论、 决策论等。 传统的评价方法 算法收敛性、收敛速度 经典优化方法 待解决的问题 离散性、不确定性、大规模 现代的优化方法 启发式算法(heuristic algorithm) 追满意(近似解) 实用性强(解决实际工程问题) 现代的评价方法 算法复杂性 现代优化方法 现代优化算法 现代优化算法又称智能优化算法或现代启发式算法,是一种具 有全局优化性能、通用性强、且适合于并行处理的算法。这种算法 一般具有严密的理论依据,而不是单纯凭借专家经验,理论上可以 在一定的时间内找到最优解或近似最优解。 它们的共同特点:都是从任一解出发,按照某种机制, 以一定的概率在整个解空间中探索最优解。由于它们可以 把搜索空间扩展到整个问题空间,因而具有全局优化性能。 全局优化 Rastrigin's Function 2 2 1 2 1 2 ( ) 20 10(cos2 cos2 ) Ras x x x x x 全局最小点 (0,0) 模拟退火算法 一、模拟退火算法基本原理 模拟退火算法(Simalated Annealing,简称SA)属于一种 通用的随机探索算法,1953年N. Metropolis (梅特罗波利斯)等人 提出了模拟退火算法,其基本思想是把某类优化问题的解过程 与统计热力学中的热平衡问题进行对比试图通过模拟高温物体退 火过程,来找到优化问题的全局最优解或近似全局最优解. 一个物体(如金属)的退火过程大体如下:首先对该物体高温加 热(熔化),显然物体内原子处于高速运行的高能状态.然而作为一个 实际的物理系统,原子的运动又总是趋于最低的能量状态,在退火的初 始状态,由于温度较高,物体处于高能状态,随着温度的逐渐降低,物 体内部原子运动化学能趋于低能状态,这种由高能向低能逐渐降温的过 程称为退火.当温度降至结晶温度后,物体由原子运动变为围绕晶体格 点的微小振动,液体凝固成固体,退火过程结束. 当我们把目标函数f (X)看成定义在可行集(解空间)上的能量曲 面,而整个曲面f (X)凹凸不平,如果让一个光滑圆球在曲面上自由滚动, 这个圆球十有八九会滚到最近的凹处停止运动,但该低谷并不一定是最 深的一个凹谷,模拟退火方法就类似于沿水平方向给圆球一个水平方向 作用力,若作用于小球的作用力足够大且小球所处的低谷并不很深. 对于一个优化问题 min ( ) ( ) 0, 1,2, , , . . ( ) 0, 1,2, , . i j f X g X i l s t h X j m 小球受水平力作用会从该低谷流出,落入另一低谷,然后 受水平力作用又滚出,如此不断滚动,如果作用小球的水平力 掌握得适当,小球很有可能停留在最深的低谷之中,这个最深 低谷就是优化问题的全局最优解或接近于全局最优解. 作用于小球上的水平力相应于模拟退火中的温度T,水平 作用力减小相应于温度降低,如图所示. 二、模拟退火算法基本迭代步骤 (1) 给定初始温度及初始点X,计算该点的函数值f(X). (2) 随机产生扰动ΔS得新点计算新点X'=X+ ΔX函数值f(X')及函数 值差Δf=f (X') –f (X) . (3) 若Δ f 0,则接受新点,作为下一次模拟的初
1. 算法的基本概念 利用计算机算法为计算机解题的过程实际上是在实施某种算法。 (1)算法的基本特征 算法一般具有4个基本特征:可行性、确定性、有穷性、拥有足够的情报。 (2)算法的基本运算和操作 算法的基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。 (3)算法的3种基本控制结构 算法的3种基本控制结构是:顺序结构、选择结构、循环结构。 (4)算法基本设计方法 算法基本设计方法:列举法、归纳法、递推、递归、减半递推技术、回溯法。 (5)指令系统 所谓指令系统指的是一个计算机系统能执行的所有指令的集合。 (2)数据结构研究的3个方面 ① 数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; ② 在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构; ③ 对各种数据结构进行的运算。 2. 逻辑结构 数据的逻辑结构是对数据元素之间的逻辑关系的描述,它可以用一个数据元素的集合和定义在此集合中的若干关系来表示。数据的逻辑结构有两个要素:一是数据元素的集合,通常记为D;二是D上的关系,它反映了数据元素之间的前后件关系,通常记为R。一个数据结构可以表示成:B=(D,R) 其中,B表示数据结构。为了反映D中各数据元素之间的前后件关系,一般用二元组来表示。 例如,如果把一年四季看作一个数据结构,则可表示成:B =(D,R) D ={春季,夏季,秋季,冬季} R ={(春季,夏季),(夏季,秋季),(秋季,冬季)} 3. 存储结构 数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构(也称数据的物理结构)。 由于数据元素在计算机存储空间中的位置关系可能与逻辑关系不同,因此,为了表示存放在计算机存储空间中的各数据元素之间的逻辑关系(即前后件关系),在数据的存储结构中,不仅要存放各数据元素的信息,还需要存放各数据元素之间的前后件关系的信息。 一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接等存储结构。 顺序存储方式主要用于线性的数据结构,它把逻辑上相邻的数据元素存储在物理上相邻的存储单元里,结点之间的关系由存储单元的邻接关系来体现。 链式存储结构就是在每个结点中至少包含一个指针域,用指针来体现数据元素之间逻辑上的联系。 1.2.2 线性结构和非线性结构 根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。 (1)如果一个非空的数据结构满足下列两个条件: ① 有且只有一个根结点; ② 每一个结点最多有一个前件,也最多有一个后件。 则称该数据结构为线性结构。线性结构又称线性表。在一个线性结构中插入或删除任何一个结点后还应是线性结构。栈、队列、串等都为线性结构。 如果一个数据结构不是线性结构,则称之为非线性结构。数组、广义表、树和图等数据结构都是非线性结构。 (2)线性表的顺序存储结构具有以下两个基本特点: ① 线性表中所有元素所占的存储空间是连续的; ② 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 元素ai的存储地址为:ADR(ai)=ADR(a1)+(i-1)k,ADR(a1)为第一个元素的地址,k代表每个元素占的字节数。 (3)顺序表的运算有查找、插入、删除3种。 1.3 栈 1. 栈的基本概念 栈(stack)是一种特殊的线性表,是限定只在一端进行插入与删除的线性表。 在栈中,一端是封闭的,既不允许进行插入元素,也不允许删除元素;另一端是开口的,允许插入和删除元素。通常称插入、删除的这一端为栈顶,另一端为栈底。当表中没有元素时称为空栈。栈顶元素总是最后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。 栈是按照“先进后出”或“后进先出”的原则组织数据的。例如,枪械的子弹匣就可以用来形象的表示栈结构。子弹匣的一端是完全封闭的,最后被压入弹匣的子弹总是最先被弹出,而最先被压入的子弹最后才能被弹出。 二级公共基础知识速学教程 2. 栈的顺序存储及其运算 栈的基本运算有3种:入栈、退栈与读栈顶元素。 ① 入栈运算:在栈顶位置插入一个新元素; ② 退栈运算:取出栈顶元素并赋给一个指定的变量; ③ 读栈顶元素:将栈顶元素赋给一个指定的变量。 1.4 队列 1. 队列的基本概念 队列是只允许在一端进行删除,在另一端进行插入的顺序表,通常将允许删除的这一端称为队头,允许插入的这一端称为队尾。当表中没有元素时称为空队列。 队列的修改是依照先进先出的原则进行的,因此队列也称为先进先出的线性表,或者后进后出的线性表。例如:火车进遂道,最先进遂道的是火车头,最后是火车尾,而火车出遂道的时候也是火车头先出,最后出的是火车尾。若有队列: Q =(q1,q2,…,qn) 那么,q1为队头元素(排头
摘要:牛顿迭代法是《数值分析》这门课程中一个重要的计算方法和思想。这次的课程设计是通过在学习中所学习到的牛顿迭代的方法的思想计算方程:方程 x3+x2-3x-3=0 在1.5附近根。并通过VISUALC++编译程序计算出方程的根。并通过这次的课程设计对所学习的知识进行进一步的总结和完善从而对原有的知识进行深化和巩固。牛顿迭代法的主要功能:计算方程时可以比较快速方便的计算出来结果但并不影响计算出来结果的精确度,运用于多种工业设计和数学设计方面。 关键词: 牛顿 迭代 方程 根 Abstract: The Newton iteration method is "Numerical analysis" in this curriculum an important computational method and the thought.The method thought computation equation in the study which this time curriculum design is through studies Newton who iterates: Asks equation x3+x2-3x-3=0 in 1.5 neighbor roots.And calculates the equation through the VISUALC++ compiler the root.Thus and designs through this time curriculum to the knowledge which studies carries on the further summary and the consummation carries on the deepening to the original knowledge and consolidated.Newton iteration method main function: When computation equation but may the quite fast convenience computation finally not affect calculates the result the precision, utilizes in many kinds of industrial design and mathematics design aspect. Key words: Newton iterates the equation root 1 牛顿迭代法的简介 1.1 牛顿迭代法的概述 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似解方程的方法。多数方程不存在根公式,因此精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。 设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0) f'(x0)(x-x0),出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并该切线与x轴的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。 解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)在x0点附近展开成泰勒级数 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=f(x)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。 1.2 牛顿迭代法的优点 迭代法是方程近似根的一个重要方法,也是计算方法中的一种基本方法,它的算法简单,是用于方程或方程组近似根的一种常用的算法设计方法。 牛顿迭代法是方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来方程的重

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值