package 一般情况;
/**
* 昨天笔试时碰到了这个问题,当时已经想到了怎么解决的,但是没时间了:
* 不能用循环和本地变量(就是局部变量),对一个整形n,实现输出n,2n,4n,...
* 当大于max(比如5000)时再逆向输出...4n,2n,n。
* 解决方法:用两个递归+成员变量搞定!
*
* 这几天关于这个问题不同人有不同解法,但是不少人(包括我)对变量分类理解很模糊~
* 我翻了一下Java疯狂讲义终于明白了!
* 在Java中,根据定义变量位置的不同,将变量分为两大类——成员变量和局部变量
* 成员变量:实例变量(即类中不以static修饰的变量)、类属性(即类中以static修饰的变量)。
* 局部变量:形参、方法里定义的变量、代码块中定义的变量(静态或非静态代码块都是)。
* 所以,这下知道这道题的意思了吧?
* @author 炜sama
*
*/
public class 递归中的递归与变量分类 {
static final int n=8;
static int sum=n;
static int max=5000;
public static void printMul(){//乘以2递归
System.out.println(sum);
if (2*sum>max) //递归终点,进入另一个递归
printDiv();
else {
sum*=2;
printMul();
}
}
public static void printDiv(){//除以2递归
System.out.println(sum);
if (sum!=n){//不符合这个条件的话就是递归终点了~
sum/=2;
printDiv();
}
}
//其实还有一个递归可以解决的方法!这是小黑大神的解法:
public static void print(){
System.out.println(sum);
if (2*sum<max){
sum*=2;
print();
}
System.out.println(sum);
sum/=2;
}
//如果可以使用本地变量那就简单得多啦~
public static void show(int n,int max){
if (n<=max) {
System.out.println(n);
show(n*2,max);
System.out.println(n);
}
}
public static void main(String[] args) {
// printMul();//符合题目要求的解法
print();
// show(8,5000);
}
}
递归中的递归与变量分类
最新推荐文章于 2024-07-22 13:35:11 发布