理论
递归函数在执行一个任务时,需要调用函数自身来完成一些子任务。在某些时候,函数不需要继续调用函数自身就可以完成当前子任务。函数不再递归的情况称作基本情形(base case,也称为基本情况)。而函数调用自身来执行子任务的情况就称作递归情形(recursive case)
形式描述
举例
理论
每次递归调用都在内存中生成一个新的函数副本(实际上仅仅是一些相关的变量)。
一旦函数结束(即返回某些数据),该返回函数的副本就从内存中删除。递归方案看起来简单,但是可视化和跟踪递归过程需要花费时间。为了更好地理解归递过程,考虑下面的例子。
在这个例子中,假设当参数n-4时调用print函数,内存分配的可视化过程如下图所示。
递归
迭代
问题一:汉诺塔迷题
解析:
汉诺塔是一个数学谜题。
有3根柱子(或木桩、塔)和一些可以在柱子之间来回移动的不同大小的圆盘。
开始时,所有的圆盘按照从小到大的次序自上而下叠放在一根柱子上,形成一个圆锥结构。
现在要求把整叠圆盘移动到另一根柱子上,移动时要遵守下面的规则:
算法思路:
public static void HRT(int n, char frompeg, char topeg, char auxpeg) {
if (n == 1) {
System.out.println("移动:从" + frompeg + "到" + topeg);
return;
}
//利用C做辅助柱将A上n-1个移动到B柱
HRT(n - 1, frompeg, auxpeg, topeg);
System.out.println("移动:从" + frompeg + "到" + topeg);
//利用A做辅助柱将B上n-1个移动到C柱
HRT(n - 1, auxpeg, topeg, frompeg);
}
问题二:给定一个数组,请用递归方法判定数组中的元素是否是有序的。
public static int isArrayInSortedOrder(int[] a, int index) {
if (index == 1) {
return 1;
}
return a[index - 1] <= a[index - 2] ? 0 : isArrayInSortedOrder(a,index-1);
}
public static void Binary(int n,int[] a) {
if (n < 1){
for (int aa:a) {
System.out.printf(aa+"");
}
System.out.println();
}else {
a[n-1]=0;
Binary(n-1,a);
a[n-1]=1;
Binary(n-1,a);
}
}
public static void kstring(int n,int k,int[] a){
if (n < 1) {
for (int aa : a) {
System.out.printf(aa+"");
}
System.out.println();
}else{
for (int i = 0; i < k; i++) {
a[n-1] = i;
kstring(n-1,k,a);
}
}
}
原文:https://www.cnblogs.com/shitouzi-shi/p/14383459.html