角谷定理python输出变化过程_角谷定理。

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

*/

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;

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值