递归和循环的一些思考
递归结构:递归体+递归头,递归也是循环的一种,不同的是每次循环的结果作为下一次循环的基础数据使用。核心思维是“自己调用自己”,我个人目前理解为,java中方法的自调用并设定调用结束点(递归头)。
递归头:相当于while循环判断条件的布尔表达式,用于终止循环
递归体:具体的计算方式或者说语句处理方式
eg:1+2+。。+100的和
```
//用循环的方式为:1到100循环累加很简单,如下:
int sum = 0;
for(int i=1;i<101;i++){//结束点:i=101
sum += i;
}
//用递归的方式为:
```
int recursionPlus(int num){//用return控制结束
if(num == 0) {//递归头,结束点,num=0,既可以做递归最后一次执行的点
return num;
}else {
return num+recursionPlus(--num);//递归体,用于计算方式的编写
}
}
```
如题:
-
从键盘输入某个十进制整数数,转换成对应的二进制整数并输出。
-
编程求:∑1+∑2+……+∑100。
-
编写递归算法程序:一列数的规则如下: 1、1、2、3、5、8、13、21、34… 求数列的第40位数是多少。
public class TestLoopAndRecursion {
public static void main(String[] args) {
//第一题
//10进制转二进制
System.out.println(decimalTransformBinary(21));
System.out.println(Integer.toBinaryString(21));
System.out.println(decimalTransformBinary(0));
System.out.println(Integer.toBinaryString(0));
System.out.println(decimalTransformBinary(1));
System.out.println(Integer.toBinaryString(1));
System.out.println();
System.out.println(decimalTransformBinary(-1));//?
System.out.println(Integer.toBinaryString(-1));
//第二题
System.out.println(recursionPlusChilds(100));//计算100的累和
System.out.println(recursionPlusFather(100));//计算1-100每个数字的累和
//System.out.println(recursionPlusFather(-100));//堆栈溢出
System.out.println(loopPlus(100));//循环方式计算1-100每个数字的累和
//第三题
System.out.println(recursionSequence(1));
System.out.println(recursionSequence(2));
System.out.println(recursionSequence(3));
System.out.println(recursionSequence(4));
System.out.println(recursionSequence(5));
System.out.println(recursionSequence(6));
System.out.println(recursionSequence(40));
}
static String decimalTransformBinary(int num) {
String str = "";
int temp;//余数
if(num == 0) {
str = "0";
}
while(num != 0) {
temp = num % 2;
str = (temp==0?0:1) + str;//整除时加0,非整除加1
num = num /2;
}
return str;
}
static int recursionPlusFather(int num) {//递归实际就是方法自调用,父级每个数字的从一的累加和
if(num == 0) {//递归头,结束标识
return num;
}else {
return recursionPlusChilds(num)+recursionPlusFather(--num);//递归体,用于计算方式的编写
}
}
static int recursionPlusChilds(int num) {//递归实际就是方法自调用,单个数字的从一的累加和
if(num == 0) {//递归头,结束标识
return num;
}else {
return num+recursionPlusChilds(--num);//递归体,用于计算方式的编写
}
}
static int loopPlus(int num) {//循环方式
int result = 0;
for (int i = 1; i <= num; i++) {
int j = i;
while(j>0) {
result += j;
j--;
}
}
return result;
}
static int recursionSequence(int position) {
if(position == 1 || position == 2) {
return 1;
}else {
return recursionSequence(position-1)+recursionSequence(position-2);
}
}
}