解释:程序调用自身的编程技巧叫做递归。
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归的三个条件:
1.边界条件
2.递归前进段
3.递归返回段
当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
下面通过两个示例程序来说明:
1.使用Java代码求5的阶乘。(5的阶乘=5*4*3*2*1)
package org.wxp.recursion; /** * 计算5的阶乘(result = 5*4*3*2*1) * @author Champion.Wong */ public class Test01 { public static void main(String[] args) { System.out.println(f(5)); } public static int f(int n) { if (1 == n) return 1; else return n*(n-1); } }
此题中,按照递归的三个条件来分析:
(1)边界条件:阶乘,乘到最后一个数,即1的时候,返回1,程序执行到底;
(2)递归前进段:当前的参数不等于1的时候,继续调用自身;
(3)递归返回段:从最大的数开始乘,如果当前参数是5,那么就是5*4,即5*(5-1),即n*(n-1)
2.使用Java代码求数列:1,1,2,3,5,8......第40位的数
package org.wxp.recursion; /** * 求数列:1,1,2,3,5,8......第40位的数 */ public class Test_02_Fibonacci { public static void main(String[] args) { System.out.println(f(6)); } public static int f(int n ) { if (1== n || 2 == n) return 1; else return f(n-1) + f(n-2); } }
3.问题描述:求解Fibonacci数列的第10个位置的值? (斐波纳契数列(Fibonacci Sequence),又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*))
程序清单:
/** *<p>Title:Java递归算法实例</p> *<p>Description:利用递归算法求解Fibonacci数列第5个数的值</p> *<p>Filename:Fibonacci.java</p> */ public class Fibonacci { /** *方法描述:求解Fibonacci数列的递归算法 *输入参数:int n *返回类型:int */ public static int fun(int n) { if(1==n || 2==n) { return 1; } else { return (fun(n-1) + fun(n-2)); } } /** *方法描述:主方法 *输入参数:String[] args *返回类型:void */ public static void main(String[] args) { System.out.println(fun(10)); } }
运行结果如下所示:
55
本文向大家介绍java递归算法的实例详解,包括了java递归算法的实例详解的使用技巧和注意事项,需要的朋友参考一下 递归三要素: 1、明确递归终止条件; 2、给出递归终止时的处理办法; 3、提取重复的逻辑,缩小问题规模。 1、1+2+3+…+n 2、1 * 2 * 3 * … * n 3、斐波那契数列 前两项均为1,第三项开始,每一项都等于前两项之和。即:1,1,2,3,5,8,… 4、二叉树的遍
本文向大家介绍C#算法之全排列递归算法实例讲解,包括了C#算法之全排列递归算法实例讲解的使用技巧和注意事项,需要的朋友参考一下 排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列; 全排列:当n==m时,称为全排列; 比如:集合{ 1,2,3}的全排列为: 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致; 算
本文向大家介绍C#用递归算法解决八皇后问题,包括了C#用递归算法解决八皇后问题的使用技巧和注意事项,需要的朋友参考一下 1.引子 中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每走一步都更靠近目标结果一些,直到遇到障碍物,我们才考虑往回走。然后再继续尝试向前。通过
本文向大家介绍Java使用递归法解决汉诺塔问题的代码示例,包括了Java使用递归法解决汉诺塔问题的代码示例的使用技巧和注意事项,需要的朋友参考一下 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。 有一个和尚想把这n个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在
我想做一个递归算法来解决做出改变的问题。是否可以使用非动态方法,不仅返回最小数量的硬币,还返回用于构成给定值的硬币集, 例如,给定值6和硬币组=[1,3,4]。有没有可能创建一个不记忆的递归算法,可以返回最小数量的硬币(2)和硬币集(3,3)? 编辑:这是我当前的算法,但它只返回硬币总数: 将返回3,但我希望它也提供集合{5,5,1}。第二个参数(2)是硬币的数量减去1。
本文向大家介绍C#用递归算法解决经典背包问题,包括了C#用递归算法解决经典背包问题的使用技巧和注意事项,需要的朋友参考一下 1.引子 我们人类是一种贪婪的动物,如果给您一个容量一定的背包和一些大小不一的物品,裝到背包里面的物品就归您,遇到这种好事大家一定不会错过,用力塞不一定是最好的办法,用脑子才行,下面就教您如何解决这样的问题,以获得更多的奖品。 2.应用场景 在一个物品向量中找到一个子