角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
(1) 问题分析:
首先判断输入的自然数是不是1,如果不是1,那就除2,否则就乘3加1然后继续递归判断
(2) 算法构造
递归体:
if (x % 2 == 0) {//如果能被2整除,偶数
x = x / 2;//除2
} else {//否则为奇数,*3+1
x = 3 * x + 1;
}
System.out.println(“自然数” + x);
count = count + 1;// 次数加1
函数出口:
X=1
(3) 算法实现(详细在源代码以及注释中加以体现)
递归形式:
public int calculation(int x) {
if (1 != x) {//如果x不等于1则进行判断
if (x % 2 == 0) {//如果能被2整除,偶数
x = x / 2;//除2
} else {//否则为奇数,*3+1
x = 3 * x + 1;
}
System.out.println("自然数" + x);
count = count + 1;// 次数加1
calculation(x);// 递归调用
}// 如果等于1返回count
return count;
}
非递归形式:
public int calculation1(int x) {
while(1!=x) {//利用while循环,如果x不等于1则进行判断
if(x%2==0) {//如果能被2整除,偶数
x=x/2;//除2
}else {
x=3*x+1;//否则为奇数,*3+1
}
System.out.println("自然数"+x);
count=count+1; //次数+1
}
return count;
}
(4) 测试结果:
运行截图:
源代码
import java.util.Scanner;
/**
* @类描述:角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,
* 则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。
* 求经过多少次可得到自然数1
* @类名称:Number
* @创建人:司志杰
* @创建时间:2018年11月18日下午1:08:05
* @修改时间:2018年11月18日下午1:08:05
* @修改备注:起初未用递归方法,改为递归方法,测试非递归方法与递归方法均正常
* @version v1.1
* @mail 1904479327@qq.com
*/
public class Number {
public static int count = 0;//count 记录次数
public static void main(String args[]) {
Scanner sca = new Scanner(System.in);
while (true) {
try {
System.out.println("请输入自然数");
int x = sca.nextInt();
if (x >= 0) {//自然数大于等于0,增加判断
int count=new Number().calculation(x);//调用递归方法,传入键盘输入的自然数,返回count次数
// int count=new Number().calculation1(x);//调用非递归方法,传入键盘输入的自然数,返回count次数
System.out.println("经过次数为" + count);//打印次数
return;//跳出循环
} else {
System.out.println("您的输入不合法,重新输入");
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("您的输入不合法");
break;
}
}
}
/**
*
* @描述:采用非递归方法 ,传入键盘输入的自然数,利用循环计算,返回次数
* @方法名: calculation1
* @返回类型 int
* @创建人szj
* @创建时间 2018年11月18日下午1:28:15
* @修改人 Administrator
* @修改时间 2018年11月18日下午1:28:15
* @修改备注 非递归方法
*/
public int calculation1(int x) {
while(1!=x) {//利用while循环,如果x不等于1则进行判断
if(x%2==0) {//如果能被2整除,偶数
x=x/2;//除2
}else {
x=3*x+1;//否则为奇数,*3+1
}
System.out.println("自然数"+x);
count=count+1; //次数+1
}
return count;
}
/**
* @描述:采用递归的方法,传入键盘输入的自然数,返回次数
* @方法名: calculation
* @return count次数
* @返回类型 int
* @创建人 szj
* @创建时间 2018年11月18日下午1:27:41
* @修改人 Administrator
* @修改时间 2018年11月18日下午1:27:41
* @修改备注 利用递归形式
*/
public int calculation(int x) {
if (1 != x) {//如果x不等于1则进行判断
if (x % 2 == 0) {//如果能被2整除,偶数
x = x / 2;//除2
} else {//否则为奇数,*3+1
x = 3 * x + 1;
}
System.out.println("自然数" + x);
count = count + 1;// 次数加1
calculation(x);// 递归调用
}// 如果等于1返回count
return count;
}
}