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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄昆 中级黑马   /  2012-7-13 12:22  /  2550 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hkylp 于 2012-7-13 12:24 编辑

H:\资料\问题/*获取一个数的十六进制表现形式。
步骤:
1、定义一个方法用于获取一个数的十六进制表现形式
1、先将该数的二进制数与15的二进制数做&运算;获取最低四位
2、将该数的二进制字节码右移四位再与15的二进制数做&运算,再获取四位。
3、如果值大于9,则用该数减去10,把结果当做数组的角标指向数组
*/
package cn.itcast.day01;

public class JavaBaseGrammerTest01 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                String[] arr={"a","b","c","d","e","f"};
                getToHex(arr,60);
               
        }
        //定义一个方法用于获取一个数的十六进制的每一位数
        public static void getToHex(String[] arr,int numbers){
                while(numbers!=0){
                        int number=numbers&15;
                        numbers=numbers>>4;
                        getToHex(arr,numbers);//运用递归
                        if(number>9){
                                int x=number-10;
                                System.out.println(arr[x]);
                        }
                        else
                                System.out.println(number);
                                
                }
        }
}

为什么打印结果是:3c3?感觉没错呀,附上我的图解,问题出在哪里呀?

0629问题图.JPG (51.68 KB, 下载次数: 45)

0629问题图.JPG

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

7 个回复

倒序浏览
H:\资料\问题
回复 使用道具 举报
  1. package hcy.test.main;

  2. class Test{
  3.         public static void main(String[] args) {
  4.                         // TODO Auto-generated method stub
  5.                         String[] arr={"a","b","c","d","e","f"};
  6.                         getToHex(arr,60);
  7.                         
  8.                 }
  9.                 //定义一个方法用于获取一个数的十六进制的每一位数
  10.                 public static void getToHex(String[] arr,int numbers){
  11.                         while(numbers!=0){
  12.                                 int number=numbers&15;
  13.                                 numbers=numbers>>4;
  14.                                 getToHex(arr,numbers);//运用递归
  15.                                 if(number>9){
  16.                                         int x=number-10;
  17.                                         System.out.println(arr[x]);
  18.                                         return;//避免循环
  19.                                 }
  20.                                 else {
  21.                                         System.out.println(number);
  22.                                         return;//避免循环
  23.                                 }
  24.                                         
  25.                         }
  26.                 }

  27. }
复制代码
回复 使用道具 举报
淡然 发表于 2012-7-13 13:07

不加return当函数最后一次返回时,输出number=3,此时numbers为0不满足循环条件函数返回,此时输出number=12,而numbers为3,因此满足循环条件,进入while循环,重复以上步骤输出number=3。所以要加return避免循环。
回复 使用道具 举报
本帖最后由 曹恒业 于 2012-7-13 13:32 编辑

为什么打印结果是:3c3?感觉没错呀,附上我的图解,问题出在哪里呀?
==============================================
问题就出现循环上,递归在这里应该是每调用用一次getToHex()方法,就输出一个转换后的16进制位,而楼主一开始的判断条件是while(numbers!=0){},所以在调用结束递归函数之后,当函数递归结束后,原函数继续执行下面的代码,而且由于循环条件是while(numbers!=0) 要还再次判断,导致又循环一次,所以多了一个3。
代码更改如下:
  1.         public static void getToHex(String[] arr,int numbers)
  2.                 {
  3.                         if(numbers!=0)    //就是在这里把while改成了if,这里不需要循环,递归的方法和循环可以相互转变
  4.                         {
  5.                                 int number=numbers&15;
  6.                                 numbers=numbers>>4;
  7.                                 getToHex(arr,numbers);//运用递归
  8.                
  9.                                 if(number>9)
  10.                                 {
  11.                                         int x=number-10;
  12.                                         System.out.print(arr[x]);
  13.                                 }
  14.                                 else
  15.                                         System.out.print(number);
  16.             }            
  17.         }
复制代码
回复 使用道具 举报
2222222222222222222222222222
回复 使用道具 举报
递归的例子有太多种吧!
、台阶问题。
楼梯有N阶,上楼可以一步上一价,也可以一次上二阶。编一个程序,计算共有多少种不同的走法。
(递归方法)
import javax.swing.JOptionPane;
public class Taijie_1 {

        public static void main(String[] args) {
                int n=Integer.parseInt(JOptionPane.showInputDialog("请输入台阶数n:  "));
                System.out.println(T(n));
        }
           public static int T(int n){
               if(n<1){
                        System.out.println("无效参数");
                    return -1;
               }     
                     else if(n==1)
                               return 1;
                        else if(n==2)
                                   return 2;
                            else
                                 return T(n-1)+T(n-2);
           }
}
(循环方法)
import javax.swing.JOptionPane;
public class Taijie_2 {

        public static void main(String[] args) {
                int n=Integer.parseInt(JOptionPane.showInputDialog("请输入台阶数n:  "));
                System.out.println(T(n));
        }
           public static int T(int n){
                  if(n<1){
                          System.out.print("无效参数");
                          return -1;
                  }
                  if(n==1)  return 1;
                  if(n==2)  return 2;
                  int T1=1,T2=2,T=0;
                  for(int i=3;i<=n;i++){
                          T=T1+T2;
                          T1=T2;
                          T2=T;
                  }
                  return T   ;
        }

}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马