递归使用的思路
来源:互联网 发布:cnki中国期刊数据库 编辑:程序博客网 时间:2024/06/06 02:46
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
- 递归使用的思路
- 使用递归解决问题的一般思路
- 使用递归解决问题的一般思路
- 递归函数的解题思路
- 递归的两种思路
- 用递归解决问题的思路
- 关于递归的思路的例子
- 函数的递归--解决问题的底层思路
- 递归函数的编写思路及注意事项
- 青蛙跳台阶问题的递归思路
- 递归算法的优化思路和CPS
- 递归重建二叉树的思路
- 汉诺塔递归衍生的递归问题一般解决思路
- 原生javascript使用递归思路获取html跟元素
- 图的遍历非递归实现的思路
- 背包问题 递归思路
- 只能说把递归的思路用到极致 了。。
- 【C++学习】函数的递归思路与举例---ShinePans
- VMware虚拟机Linux忘记root密码
- 【译】潜在语义分析Latent Semantic Analysis (LSA)
- Saving HDU
- 视频播放如何横竖屏切换续
- 通讯网路问题
- 递归使用的思路
- ubuntu 修改鼠标左键选中文字的颜色
- spring2.5 注解依赖注入由于jdk1.8产生的问题
- 给大家带来一个福利app
- !HDU 4311 最小曼哈顿距离-思维&卡时间-(横纵坐标分开算,排序)
- 显示JPEG
- 黑马程序员-----------C语言基础-----------基础语法
- BeautifulSoup的详细笔记
- HDU - 3681 Prison Break(状态压缩 + 最短路)