递归使用的思路

来源:互联网 发布:cnki中国期刊数据库 编辑:程序博客网 时间:2024/06/06 02:46

4条基本法则

  1. 基准情形(要考虑方法的每个参数,一般是某些参数为某个值时另一些参数需要某些限制时
  2. 不断推进(推向基准情形)
  3. 设计法则(即问题分化前与第一次分化后的相互转换关系)
  4. 合成效应法则:在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性工作

思想

在处理(大的)问题时,发现可把该问题分成多个小的问题,处理方法都一样,只是参数设置不同,此时就要看分化问题实质是分化哪些参数

在此我把递归方法分成两种情形:需要返回值 / 不需要返回值的情形

1.需要返回值时

脑中抽象出/构想出一个三角形△,顶点为大问题(未分化),底边为基准情形,从顶点可一步步向基准分化
举个栗子:

//一道面试题,一个骰子掷10次,各次结果的和为50有多少种可能/*此时构建的三角形:顶点--------第10次投掷后和为50往下分化一次--[6,44](6表示第10次投掷结果,44为前9次结果的和),[5,45],[4,46],[3,47],[2,48],[1,49]底边--------6,5,4,3,2,1*/public class Dice {    //t:投掷次数;s:各次结果的和    static int f(int t,int s)    {        //基准情形:当分化到第一次投掷时(t=1),和为第一次投掷的结果,s应为1~6的整数,        //若符合,则算做一种可能,若不符合,则忽略        if(t==1&&s>=1&&s<=6){            return 1;        }        else if(t==1&&(s>6||s<1)){            return 0;        }        return f(t-1,s-1)+f(t-1,s-2)                +f(t-1,s-3)+f(t-1,s-4)                +f(t-1,s-5)+f(t-1,s-6);    }    public static void main(String[] args) {        System.out.println(f(10,50));    }}

2.不需要返回值

汉诺塔问题
想象:要完成 n 次工作,在完成 n-1 次时如何完成再第 n 次,由此构建第 n 次与第 n-1 次的转换关系

public class Hanoi {    //  n是要移动盘子的数量//  fromPillar从哪个柱子开始移//  toolPillar要移到目的柱子所要借助的工具柱子  //  toPillar目的地柱子    public static void move(int n,char fromPillar,char toolPillar,char toPillar)    {        //基准情形        if(n==1){            System.out.println("Disk 1 from "+fromPillar+" to "+toPillar);        }        else{            /*如果要移动 n个盘子,则可想象成在已经移动好 n-1个盘子后突然发现还有第 n个盘子没有移,            此时则要把这 n-1个盘子从目的地柱子按照原来从起始柱子移到目的柱子的方法全移出去到工具柱子,            但现实不会在开始移时漏掉最后一个,所以可想象成穿越回到刚开始移时,就直接把 n-1个盘子从起始柱子移到工具柱子,            而这样移只能借助目的柱子了*/            move(n-1,fromPillar,toPillar,toolPillar);            //经过上一步后第 n个盘子上面没堆有盘子,目的柱子也没有盘子,直接把第 n盘子移到目的柱子即可            System.out.println("Disk "+n+" from "+fromPillar+" to "+toPillar);            //还是按照同样的方法把在工具柱子上的 n-1个盘子移到目的柱子            move(n-1,toolPillar,fromPillar,toPillar);        }    }    public static void main(String[] args) {            move(4,'A','B','C');    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 结石堵在输尿管怎么办 尿路结石痛怎么办 怀孕了有肾结石怎么办 怀孕有肾结石怎么办啊 肾结石无疼血尿怎么办 胆囊胆管都结石怎么办 肾里面有肿瘤怎么办 肾癌手术后发烧怎么办 尿结石堵住尿道怎么办 尿结石不能排尿怎么办 肾癌小便有血怎么办 膀胱癌膀胱全切怎么办 怀孕了有阑尾炎怎么办 食物堵塞在食管怎么办 食物卡在食管怎么办 小孩食道卡异物怎么办 八十岁老人得了膀胱癌怎么办 肾结石引起吐血尿血怎么办 肾结石引起的尿血怎么办 食道感觉有异物怎么办 膀胱出血有血块怎么办 肾小球滤过率20怎么办 膀胱癌术后有血尿怎么办 肾病贫血怎么办吃什么 低蛋白血症怎么办 慢性肾炎患者感冒了怎么办 透析病人磷高怎么办 尿毒症透析磷高怎么办 怀孕了有膀胱炎怎么办 宝宝拉肚子尿少怎么办 猫尿血怎么办吃什么药 肝癌小便不出来怎么办 怀孕三个月结石血尿怎么办? 肾小球滤过率65怎么办 肾穿后有血肿6cm怎么办 肾穿刺后血肿怎么办 手术后有血肿怎么办 尿蛋白胆红素高怎么办 哺乳期尿蛋白高怎么办 产后老放屁便秘怎么办 肝癌移植后复发怎么办