理论上,任何循环都可以用递归来代替。有些函数式语言甚至不提供循环结构,而仅仅使用递归。
如可以让其他人打印上半部分,我打印中间部分,其他人打印下半部分
上面这一个代码我感觉类似于二叉树的遍历了, 一个算法你可能碰巧做对,但是用语言描述出来,让别人理解你的想法有一定的难度= =
当然,递归也可以通过循环和自己定义的栈结构来模拟。
递归与数学上的递推公式有点相似,相同点在于都是在寻找相似性
package NO4;
public class Test03 {
static void f(int begin, int end){
//递归输出0-9
if(begin > end)
return;
f(begin, end-1);
System.out.println(end); //
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/* 循环输出0-9
for(int i = 0; i < 10;i++)
System.out.println(i);
*/
f(0, 9);
}
}
关于递归问题的分解不是唯一的,此处是先做最后一步的输出(end),然后把其他步骤交给后面进行
如我可以先打印第一步,后续的工作交给其他进行
package NO4;
public class Test04 {
static void f(int begin, int end){
if(begin>end)
return;
System.out.println(begin);//先打印第一步,后续工作交给后面进行
f(begin+1, end);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
f(0, 9);
}
}
如我可以先打印begin和end,中间的工作可以交给其他人
package NO4;
public class Test05 {
static void f(int begin, int end){
if(begin > end)
return;
System.out.println(begin);
f(begin+1, end-1);
if(begin != end )//如果begin等于end则不重复打印
System.out.println(end);
}
public static void main(String[] args) {
// TODO Auto-generated method
f(0, 21);
}
}
如可以让其他人打印上半部分,我打印中间部分,其他人打印下半部分
package NO4;
public class Test09 {
static void f(int begin, int end){
int middle = (int) Math.floor((begin + end ) / 2);
//System.out.println("ok" + middle);
if(begin == end){
System.out.println(begin);
return;
}
if((end - begin + 1 ) % 2 != 0 )//<span style="font-family: Verdana, Arial, sans-serif;">begin-end所表示的范围长度是奇数</span>
f(begin, middle - 1);
else
f(begin, middle);
if((end-begin +1) % 2 != 0) //begin-end所表示的范围长度是奇数
System.out.println(middle);
f(middle + 1, end);
}
public static void main(String[] args) {
// TODO Auto-generated method
f(1,10);
}
}
上面这一个代码我感觉类似于二叉树的遍历了, 一个算法你可能碰巧做对,但是用语言描述出来,让别人理解你的想法有一定的难度= =