A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

搞了半天。还是不解,求原理?代码怎么写的。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

13 个回复

倒序浏览
本帖最后由 陈圳 于 2013-4-15 10:06 编辑
  1. System.out.println(getMax(3,2,6,4,3,10));
  2.                 System.out.println(getMaxNum(3,4,6,34,10));
  3.         }
  4.         public static int getMax(int...arr){
  5.                 int max=arr[0];
  6.                 for(int i=1;i<arr.length;i++){
  7.                         if(max<arr[i])
  8.                                 max=arr[i];
  9.                 }
  10.                 return max;
  11.         }
  12.         public static int getMaxNum(int length,int...arr){方法有误,我在修改
  13.                 int max=arr[length-1];
  14.                 if(max<arr[length])
  15.                         return  getMaxNum(length--,arr);
  16.                 else return max;
  17.         }
复制代码
这样做没有意义哦,只是实现了.

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
建议楼主去看看毕老师第20天中IO流的第7小节内容,讲得很详细的,可好好参考参考~~~
回复 使用道具 举报
本帖最后由 通行天下 于 2013-4-15 10:42 编辑
  1. class TestMax
  2. {
  3.         static int max = 0;
  4.         public static int getMax(int[] a,int i)
  5.         {
  6.                 for(;i<a.length-1;)
  7.                 {
  8.                         if(a[i] > a[max])
  9.                         {
  10.                                 max = i;
  11.                                 getMax(a,++i);
  12.                         }
  13.                         getMax(a,++i);
  14.                 }
  15.                 return a[max];
  16.         }
  17.         public static void main(String[] args)
  18.         {
  19.                 int[] arr = {1,5,3,4,7,9,8};
  20.                 System.out.println("Max="+getMax(arr,1));
  21.         }
  22. }

  23. 希望对你有用!
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
  1. int[] arr={5,46,57,600,340,100};
  2.                 int length=arr.length-1;
  3.                 int max=0;
  4.                 System.out.println(getMaxNum(max,length,arr));
  5.         }
  6.         public static int getMax(int...arr){
  7.                 int max=arr[0];
  8.                 for(int i=1;i<arr.length;i++){
  9.                         if(max<arr[i])
  10.                                 max=arr[i];
  11.                 }
  12.                 return max;
  13.         }
  14.         public static int getMaxNum(int max,int length,int...arr){
  15.                 if(length==0)
  16.                         return max;
  17.                 if(max<arr[length])
  18.                                 max=arr[length]+(arr[length]=max)*0;
  19.                 return getMaxNum(max,length-1,arr);
  20.         }
复制代码
回复 使用道具 举报
陈圳 发表于 2013-4-15 10:41

其它的都看懂了。这一句(arr[length]=max)*0;是什么意思?求教?
回复 使用道具 举报
Alan 中级黑马 2013-4-15 11:38:43
7#
楼主看以下代码 就OK了
  1. 概述
  2. 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。递归有直接递归和间接递归
  3. •直接递归:函数在执行过程中调用本身。
  4. •间接递归:函数在执行过程中调用其它函数再经过这些函数调用本身。
  5. •表达方式:

  6. •递归算法有四个特性:
  7. (1)必须有可最终达到的终止条件,否则程序将陷入无穷循环;
  8. (2)子问题在规模上比原问题小,或更接近终止条件;
  9. (3)子问题可通过再次递归调用求解或因满足终止条件而直接求解;
  10. (4)子问题的解应能组合为整个问题的解。

  11. 下面将从以下几个典型的例子来讲解递归算法:

  12. 汉诺塔问题
  13. 如图,汉诺塔问题是指有三根杆子A,B,C。C杆上有若干碟子,把所有碟子从C杆上移到B杆上,每次只能移动一个碟子,大的碟子不能叠在小的碟子上面。求最少要移动多少次?

  14. 当n=1时:
  15. Move  1  from  A  to  C
  16. 当n=1时:
  17. Move  1  from  A  to  B
  18. Move  2  from  A  to  C
  19. Move  1  from  B  to  C
  20. 当n=1时:
  21. Move  1  from  A  to  C
  22. Move  2  from  A  to  B
  23. Move  1  from  C  to  B
  24. Move  3  from  A  to  C
  25. Move  1  from  B  to  A
  26. Move  2  from  B  to  C
  27. Move  1  from  A  to  C
  28. 源代码
  29. [java]  
  30. static StringBuffer str = new StringBuffer();  
  31.     /**
  32.      * //汉诺塔问题
  33.      * @param n 盘子的个数
  34.      * @param x 将要移动盘子柱子
  35.      * @param y 要借用的柱子
  36.      * @param z 要移动到的柱子
  37.      * @return
  38.      */  
  39.     public static String hanio(int n, Object x, Object y, Object z) {  
  40.         //String str ="";  
  41.         if(1 == n)   
  42.             str.append(move(x, n, z) + "\n");  
  43.         else {  
  44.             hanio(n-1, x, z, y);  
  45.             str.append(move(x, n, z) + "\n") ;  
  46.             hanio(n-1, y, x, z);  
  47.         }  
  48.         return str.toString();  
  49.     }  
  50.     private static String move(Object x, int n, Object y) {  
  51.         //System.out.println("Move  " + n + "  from  " + x + "  to  " + y);  
  52.         return "Move  " + n + "  from  " + x + "  to  " + y;  
  53.     }  
  54.       

  55. fibonacci数列
  56. 斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)
  57. 源代码
  58. [java]
  59. /**
  60.      * fibonacci数列
  61.      * @param n
  62.      * @return
  63.      */  
  64.     public static long fibonacci(int n) {  
  65.         if((0 == n) || (1 == n)) {  
  66.             return n;  
  67.         }else {  
  68.             return fibonacci(n-1) + fibonacci(n-2);  
  69.         }  
  70.     }  


  71. 1加到n累加
  72. 用递归实现从1加到n,即1+2+3+4+...+n。
  73. 源代码
  74. [java]  
  75. /**
  76.      * 累加,从1加到n,即1+2+3+4+...+n
  77.      * @param n 要累加到的数值
  78.      * @return 累加的结果
  79.      */  
  80.     public static long total(int n) {  
  81.         if(1 == n) {  
  82.             return n;  
  83.         }else {  
  84.             return total(n-1) + n;  
  85.         }  
  86.     }  


  87. 从1到n累积
  88. 用递归实现,从1到n累积,即1*2*3*...*n
  89. 源代码
  90. [java]
  91. /**
  92.      * 从1到n的累积,即1*2*3*...*n
  93.      * @param n 要累乖到的数值
  94.      * @return
  95.      */  
  96.     public static long accumulate(int n) {   
  97.         if(1 == n) {  
  98.             return n;  
  99.         }else {  
  100.             return accumulate(n-1) * n;  
  101.         }  
  102.     }  


  103. 求数组中的最大值
  104. 用递归算法求数组中的最大值。
  105. 源代码
  106. [java]  
  107. /**
  108.      * 用递归算法求数组中的最大值
  109.      * @param a 数组
  110.      * @param low 数组下标
  111.      * @param heigh 数组上标
  112.      * @return
  113.      */  
  114.     public static int Max(int[] a, int low, int heigh) {  
  115.         int max;  
  116.         if(low > heigh-2) {  
  117.             if(a[low] > a[heigh]) max = a[low];  
  118.             else max = a[heigh];  
  119.         }else {  
  120.             int mid = (low + heigh)/2;  
  121.             int max1 = Max(a, low, mid);  
  122.             int max2 = Max(a, mid+1, heigh);  
  123.             max = max1>max2 ? max1 : max2;  
  124.         }  
  125.         return max;  
  126.     }  


  127. 数字塔问题
  128. 用递归算法求解数字塔问题。
  129. n=1时
  130. 1
  131. n=2时
  132. 1      
  133. 2      2      
  134. n=3时
  135. 1      
  136. 2      2      
  137. 3      3      3   
  138. n=4时
  139. 1      
  140. 2      2      
  141. 3      3      3      
  142. 4      4      4      4   
  143. 源代码
  144. [java]  
  145. /**
  146.      * 用递归算法求解数字塔问题
  147.      * @param n 数字塔的行数
  148.      * @return 数字塔的字符串
  149.      */  
  150.     public static String tourData(int n) {  
  151.         String str = new String();  
  152.         if(1 == n) {  
  153.             str = rowData(n) + "\n";  
  154.             return str;  
  155.         }  
  156.         else {  
  157.             str = tourData(n-1) + rowData(n) + "\n";  
  158.         }  
  159.         return str;  
  160.     }  
  161.     private static String rowData(int n) {  
  162.         String str = new String();  
  163.         for(int i=0; i<n; i++) {  
  164.             str = str+ n + "      ";  
  165.         }  
  166.         return str;  
  167.     }  
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
陈圳 高级黑马 2013-4-15 11:43:20
8#
影响力147753321 发表于 2013-4-15 11:13
其它的都看懂了。这一句(arr[length]=max)*0;是什么意思?求教?
  1. 今日总结:关于一步交换两个数值的方法的升华;
  2.         int a=5,b=3;
  3.         a=b+(b=a)/0;一步交换两个数的值//也是一种最优的算法吧.
  4.         异或:异或是位运算,速度应该比较快.
  5.         a=a^b;
  6.         b=a^b;
  7.         a=a^b;
  8.         简化:
  9.         a=b^(b=a)^a;//现写笔记现总结的.有用!
  10.         比较两种方法:a=b^(b=a)^a;
  11.         a=b^(b=a)^a;
  12.         经过真实测试:所有交换两种数值的方法中:
  13.         a=b+(b=a)/0;是最快的.所以建议使用这个
  14. /*以下是n=100000000循环次交换两数取值的使用时间花费:a=b+(b=a)/0速度最快.
  15.         而且也证了一步运算,比正确交换值效率要高.
  16.         a1=99999994
  17.         406毫秒
  18.         a2=99999994
  19.         281毫秒
  20.         a3=99999994
  21.         485毫秒
  22.         a4=99999994
  23.         438毫秒*/
  24.         /**反转List集合内的元素
  25.         */
  26.         public  static <T> List<T> reveriousList(List<T> list){
  27.                 int length=list.size()-1;
  28.                 for(int i=0;i<list.size()/2;i++,length--)
  29.                         list.set(i,list.set(length,list.get(i)));//实现一步交换两个List集合的值.
  30.                 return list;
  31.         }
  32.         分析算法:互相list集合中两个元素的位置                                       
  33.         4        5                               
  34.         0        1                               
  35.         第一步:list.set(0,list.set(1,list.get(0)));       
  36.         第二步:list.set(0,list.set(1,4))                                       
  37.         第三步:list.set(0,5)                                       
  38.         这样,一句话就实现了两个值的互换.我自己想的,哈哈.                                       
  39.         /*
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
晕,你们写那么多看得我真累,编程追求的是简单化,
以下是我自己的代码实现,不知道还能不能简化,
  1. class DiGui
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr = {4,5,55,7,9,22,32,19};
  6.                 //从指定角标开始搜索
  7.                 int max = getMax(arr,7);
  8.                
  9.                 System.out.println(max);
  10.         }
  11.         //从指定角标开始搜索数组,获取最大值
  12.         public static int getMax(int[] arr,int index)
  13.         {
  14.                 if(index>arr.length-1)
  15.                 {
  16.                         throw new RuntimeException("请不要超出我的能力极限");
  17.                 }
  18.                 if(index==arr.length-1)
  19.                 {
  20.                         return arr[index];
  21.                 }
  22.                 if(index<arr.length-1)
  23.                 {
  24.                         if(arr[index]>arr[0])
  25.                         {
  26.                                 int temp = arr[0];
  27.                                 arr[0] = arr[index];
  28.                                 arr[index] = temp;
  29.                                 index++;
  30.                                 getMax(arr,index);
  31.                         }
  32.                         else
  33.                         {
  34.                                 index++;
  35.                                 getMax(arr,index);
  36.                         }
  37.                 }
  38.                 return arr[0];
  39.         }
  40. }
复制代码
回复 使用道具 举报
本帖最后由 吴林飞 于 2013-4-15 13:58 编辑

刚刚的有点问题修改了下
  1. class DiGui1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr = {4,5,55,7,9,22,32,59};               
  6.                 int max = getMax(arr,7);            
  7.                 System.out.println(max);
  8.         }
  9.         //从指定角标开始搜索数组,获取最大值
  10.         public static int getMax(int[] arr,int index)
  11.         {
  12.                 if(index>=arr.length)
  13.                 {
  14.                         throw new RuntimeException("请不要超出我的能力极限");
  15.                 }
  16.                 if(index<arr.length)
  17.                 {
  18.                         if(arr[index]>arr[0])
  19.                         {
  20.                                 int temp = arr[0];
  21.                                 arr[0] = arr[index];
  22.                                 arr[index] = temp;
  23.                                 if(index==arr.length-1)
  24.                                         return arr[0];
  25.                                 index++;
  26.                                 getMax(arr,index);
  27.                         }
  28.                         else
  29.                         {
  30.                                 if(index==arr.length-1)
  31.                                         return arr[index];
  32.                                 index++;
  33.                                 getMax(arr,index);
  34.                         }
  35.                 }
  36.                 return arr[0];
  37.         }
  38. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
陈圳 发表于 2013-4-15 10:41

你的代码有问题,如果我给出的数组是int[] arr={1100,46,57,600,340,900},求出的最大值是900.
回复 使用道具 举报
吴林飞 发表于 2013-4-15 13:53
你的代码有问题,如果我给出的数组是int[] arr={1100,46,57,600,340,900},求出的最大值是900. ...

那个代码是有问题,我注释了写了...我下面把改正后的代码在楼下又发过...
回复 使用道具 举报
影响力147753321 发表于 2013-4-15 11:13
其它的都看懂了。这一句(arr[length]=max)*0;是什么意思?求教?

我做题做晕了.这个根本不需要换值.坑爹呀.如果赋值就行了.但是那个还是有点用的.
回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马