zoukankan      html  css  js  c++  java
  • 递归

    一、递归关键之处

    1、停止条件

    即如果问题很简单,已经是个不能再分解的任务了,那么就不要用递归来解决。比如这里的number只有一位时。这种没有任何递归调用的情况即是停止条件或基本条件。

    2、递归调用

     递归调用自身,用于解决比较简单的问题,在这里即输出除最后一位之外的所有位。

    二、示例

    案例1

    两个人从1开始,轮流报数,每个人都只能报接下来的一个数或两个数。比如第一个人可以报1,也可以报1、2;如果第一个人报1、2,第二个人就可以报3或者3、4;然后第一个人又报......这样报下去,最先报到30的人获胜,求必胜策略。

    解答:最先报到30的人获胜,那么先报到27的人就一定可以获胜,同理先报到24的人就一定能获胜……递归下去。21,18,15……,最终得到的结论就是先报到3的人必胜。也就是说,后报者必胜。不管先报者报多少,后报者始终能报到3的倍数,必胜。

    如果先报到30的人输,同理,先报到29的人就赢了,然后同样递归,26,23,20……

    案例2

    有10枚硬币,每人轮流取硬币,可以拿一枚、两枚或四枚,取到最后一枚硬币者胜。求必胜策略。

    利用递归思想解答:

    硬币总数是一枚,先取者赢;
    硬币总数是两枚,先取者赢;
    硬币总数是三枚,先取者输;
    硬币总数是四枚,先取者赢;
    硬币总数是五枚,先取者赢(自己取两枚,对方面临三枚的情形,必输);
    硬币总数是六枚,先取者输(不管取多少,对方面临的情形都是必胜的);
    硬币总数是七枚,先取者赢(自己取一枚,对方面临六枚的情形,必输);
    硬币总数是八枚,先取者赢(自己取两枚,对方面临六枚的情形,必输);
    硬币总数是九枚,先取者输(不管取多少,对方面临的情形都是必胜的);
    硬币总数是十枚,先取者赢(自己取一枚,对方面临九枚的情形,必输)。

    案例3

    #include<iostream>
    using namespace std;
    void WriteVertical(int number){
        //Postcondition:The digit of the number have between written,stacked vertically.
        //If number is negative,then a negative sign appears on top.
        //Library facilities used:iostream(using namespace std)
        if (number < 0){
            cout << '-' << endl;
            WriteVertical(abs(number));
        }
        else if (number < 10)
            cout << number << endl;
        else{
            WriteVertical(number / 10);
            cout << number % 10 << endl;
        }
    }
    int main(){
        WriteVertical(-361);
        return 0;
    }

    Reference:

    递归思想(一)

    http://www.slyar.com/blog/recursion-math-questions.html

  • 相关阅读:
    spring源码解析四( spring事务)
    Epoll的本质(内部实现原理)转载
    Gitlab+Jenkins+Docker+K8S实现CI/CD
    AIOps
    云运维的关键有哪些?
    Nginx代理Portainer
    nginx+tomcat+mysql进行负载均衡
    Docker安装及容器创建
    运维常用的linux命令操作
    Arm64安装docker和docker-compose
  • 原文地址:https://www.cnblogs.com/549294286/p/3688019.html
Copyright © 2011-2022 走看看