zoukankan      html  css  js  c++  java
  • 基础算法思想(一)

    递推算法

    使用“步步为营”的方法 不断利用已有的信息推导出新的东西

    分为

    顺推法:从已知的条件出发 逐步推算出要解决问题的方法。例如:斐波拉契数列( 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233......  这个数列从第2项开始,每一项都等于前两项之和。)

    逆推法:从已知的结果出发 用迭代表达式逐步推算出问题开始的条件。

    顺推法的实际例子:

    一开始有一只1月大的兔子 每1个月长大一次 到第3月长为大兔并生一只1月大的小兔 以此类推 算出兔子的总数

    Image

    程序实现斐波那契数列:

    static void Main(string[] args)
            {
                Console.WriteLine("请输入一个序号 最大为20:");
                int range = 20;
                int i = int.Parse(Console.ReadLine());
    
                int[] array = new int[20];
                array[0] = 1;
                array[1] = 1;
    
                if (i == 1)
                {
                    Console.WriteLine("1");
                }
                else if(i == 2)
                {
                    Console.WriteLine("1");
                    Console.WriteLine("1");
                }
                else if(i >= 3 && i <= 20)
                {
                    Console.WriteLine("1");
                    Console.WriteLine("1");
                    for (int j = 3; j <= i; j++)
                    {
                        array[j - 1] = array[j - 2] + array[j - 3];
                        Console.WriteLine(array[j - 1]);
                    }
                }
                else
                {
                    Console.WriteLine("输入的数字超过范围");
                }
                Console.ReadKey();
            }

    结果显示:

    image

    逆推法的实际例子:

    image

    程序实现求出每个月的月末存款:

    int fetch = 1000;
                float rate = 0.0171f;
                double[] corpus = new double[49];
    
                corpus[48] = (double) fetch;
                Console.WriteLine("第48月末本利合计:"+corpus[48]);
                for (int i = 47; i > 0; i--)
                {
                    corpus[i] = (corpus[i + 1] + 1000)/(1 + rate/12);
                    Console.WriteLine("" + i + "月末本利合计:"+corpus[i]);
                }
                Console.ReadKey();

    结果显示:

    image


    枚举算法

    枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:
    (1)可预先确定候选答案的数量
    (2)候选答案的范围在求解之前必须有一个确定的集合

    枚举法的实际例子一: 找出满足这样要求的的数字组合

    image

    程序实现:

    static void Main(string[] args)
            {
                int i1, i2, i3, i4, i5;
                long multi, result;
                for (i1 = 1; i1 <= 9; i1++)
                {
                    for (i2 = 0; i2 <= 9; i2++)
                    {
                        for (i3 = 0; i3 <= 9; i3++)
                        {
                            for (i4 = 0; i4 <= 9; i4++)
                            {
                                for (i5 = 0; i5 <= 9; i5++)
                                {
                                    multi = i1 * 10000 + i2 * 1000 + i3 * 100 + i4 * 10 + i5;
                                    result = i5 * 100000 + i5 * 10000 + i5 * 1000 + i5 * 100 + i5 * 10 + i5;
                                    if (multi * i1 == result)
                                    {
                                        Console.WriteLine("  " + i1 + i2 + i3 + i4 + i5);
                                        Console.WriteLine("×    " + i1);
                                        Console.WriteLine("______________");
                                        Console.WriteLine(" " + i5 + i5 + i5 + i5 + i5 + i5);
                                    }
                                }
                            }
                        }
                    }
                }
                Console.ReadKey();

    结果显示:

    image


    递归算法

    递归算法,就是一种直接或者间接地调用自身的算法。递归算法的具体实现过程一般通过函数或子过程来完成,在函数或子过程的内部,编写代码直接或者间接地调用自己,即可完成递归操作

    递归算法实例:求阶乘

    image

    程序实现:

    static void Main(string[] args)
            {
                Console.WriteLine("请输入要求阶乘的一个整数");
                int i = int.Parse(Console.ReadLine());
                Console.WriteLine("阶乘的结果为:" + Fact(i));
                Console.ReadKey();
            }
    
            private static int Fact(int n)
            {
                if (n <= 1)
                {
                    return 1;
                }
                else
                {
                    return Fact(n - 1)*n;
                }
            }

    结果:

    image

  • 相关阅读:
    Spring中的BeanUtils与apache commons中的BeanUtils用法[1]
    C# rmi例子
    跨时钟域设计的一点总结
    FPGA跨时钟域异步时钟设计的几种同步策略-可编程逻辑-与非网
    关于FPGA异步时钟采样--结绳法的点点滴滴
    sigaction函数解析
    可重入函数
    SCHED_OTHER,SCHED_FIFO,SCHED_RR-intentness-ChinaUnix博客
    qt安装教程
    VS2013 平台下搭建 QT5.3 开发环境
  • 原文地址:https://www.cnblogs.com/moguwang/p/5230388.html
Copyright © 2011-2022 走看看