黑马程序员技术交流社区
标题:
递归
[打印本页]
作者:
黄昆
时间:
2012-7-13 12:22
标题:
递归
本帖最后由 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, 下载次数: 72)
下载附件
2012-7-13 12:23 上传
作者:
黄昆
时间:
2012-7-13 12:22
H:\资料\问题
作者:
淡然
时间:
2012-7-13 13:07
package hcy.test.main;
class Test{
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]);
return;//避免循环
}
else {
System.out.println(number);
return;//避免循环
}
}
}
}
复制代码
作者:
淡然
时间:
2012-7-13 13:13
淡然 发表于 2012-7-13 13:07
不加return当函数最后一次返回时,输出number=3,此时numbers为0不满足循环条件函数返回,此时输出number=12,而numbers为3,因此满足循环条件,进入while循环,重复以上步骤输出number=3。所以要加return避免循环。
作者:
曹恒业
时间:
2012-7-13 13:31
本帖最后由 曹恒业 于 2012-7-13 13:32 编辑
为什么打印结果是:3c3?感觉没错呀,附上我的图解,问题出在哪里呀?
==============================================
问题就出现循环上,递归在这里应该是每调用用一次getToHex()方法,就输出一个转换后的16进制位,而楼主一开始的判断条件是while(numbers!=0){},所以在调用结束递归函数之后,当函数递归结束后,原函数继续执行下面的代码,而且由于循环条件是while(numbers!=0) 要还再次判断,导致又循环一次,所以多了一个3。
代码更改如下:
public static void getToHex(String[] arr,int numbers)
{
if(numbers!=0) //就是在这里把while改成了if,这里不需要循环,递归的方法和循环可以相互转变
{
int number=numbers&15;
numbers=numbers>>4;
getToHex(arr,numbers);//运用递归
if(number>9)
{
int x=number-10;
System.out.print(arr[x]);
}
else
System.out.print(number);
}
}
复制代码
作者:
咋还起名
时间:
2012-8-15 07:18
2222222222222222222222222222
作者:
王永杰
时间:
2012-9-5 13:18
递归的例子有太多种吧!
、台阶问题。
楼梯有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 ;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2