角谷定理。

8 篇文章 0 订阅

角谷定理。输入一个自然数,若为偶数,则把它除以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;
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值