Java编程算法基础----递归与循环关系

来源:互联网 发布:菜鸟学java 编辑:程序博客网 时间:2024/05/20 10:15
理论上,任何循环都可以用递归来代替。有些函数式语言甚至不提供循环结构,而仅仅使用递归。

当然,递归也可以通过循环和自己定义的栈结构来模拟。



递归与数学上的递推公式有点相似,相同点在于都是在寻找相似性

package NO4;public class Test03 {    static void f(int begin, int end){//递归输出0-9if(begin > end)return;f(begin, end-1);System.out.println(end); //}public static void main(String[] args) {// TODO Auto-generated method stub       /* 循环输出0-9for(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 stubf(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 methodf(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);}}


上面这一个代码我感觉类似于二叉树的遍历了, 一个算法你可能碰巧做对,但是用语言描述出来,让别人理解你的想法有一定的难度= =

0 0
原创粉丝点击