Java实现递归计算n的阶乘
作者:这个对数不太对 发布时间:2021-06-26 14:34:26
本文实例为大家分享了Java实现递归计算n的阶乘的具体代码,供大家参考,具体内容如下
问题描述
利用递归的思想实现阶乘的计算,以 n!为例
(一)、n的范围
1.n<0:n!无意义
2.n=0或n=1:n!=1
3.n>2:n!=n(n-1)!
关于 0!=1 的一个合理性解释:
根据阶乘的定义n!=n(n-1)!,
可变形为n=(n+1)!/(n+1),
带入有0=1!/1=1
(二)、问题分析
1.n<0时提醒用户输入有误
(1)在未知循环次数时,可以采用while语句来提醒
(2)while语句中用continue结束循环
while语句中break和continue的区别
(1)break:跳出本层循环,即进入了一次循环体后,执行完一次循环体内的语句,就不再进行是否进入循环体的判断
(2)continue:跳出本次循环,即进入一次循环体后,执行完一次循环体内的语句,会再次回到循环入口判断是否进行循环,是则继续,如此反复
由于不能确定用户输入有误的次数,所以要用continue
public static void main(String[] args) {
int n;
Scanner sc = new Scanner(System.in);
System.out.println("请输入n的值");
n = sc.nextInt();
while(n<0) {
System.out.println("输入有误,n要大于等于0哦");
System.out.println("请再次输入");
n = sc.nextInt();
continue;
}
}
2.n>=0时调用方法进行计算
(1)新建一个类构造一个带参方法 recursion 计算阶乘,注意该方法的名字不能与最初建的类(public class Recursion)重名
(2)引用一个if语句:当n=0或1时,结果返回为1;其余情况n!=n(n-1)!
(3)阶乘的思想是递归,即自己调用自己。不断地把最新的n用 n * recursion1(n-1) 代替,直到n=1,以此达到n!=n(n-1)(n-2)···2·1的结果
public static int recursion (int n) {
if (n==0||n==1)
return 1;
else{
return n * recursion(n-1);
}
}
3.结果输出放在main()中
(1)由于方法常常封装在另一个类里面,所以一般先实例化一个对象(recursion1),再用该对象调用该方法(recursion)
(2)实例化的对象应该是最初类(Recursion)的对象,所以是Recursion recursion1= new Recursion();
(3)由于类中只能定义变量和方法,不能直接实例化对象,也不能写单独的语句,而且在编写类方法的时候,不能调用类本身(除非编写的是类中的main方法),所以这两行代码应该放在main()方法中。
Recursion recursion1= new Recursion();
System.out.println("n!="+ recursion1.recursion(n));
(三)、完整代码
把以上代码合并一下
import java.util.*;
public class Recursion {
public static void main(String[] args) {
int n;
Scanner sc = new Scanner(System.in);
System.out.println("请输入n的值");
n = sc.nextInt();
while(n<0) {
System.out.println("输入有误,n要大于等于0哦");
System.out.println("请再次输入");
n = sc.nextInt();
continue;
}
Recursion recursion1= new Recursion();
System.out.println("n!="+ recursion1.recursion(n));
}
public static int recursion (int n) {
if (n==0||n==1)
return 1;
else{
return n * recursion(n-1);
}
}
}
(四)、运行结果
来源:https://blog.csdn.net/m0_57060319/article/details/119616802


猜你喜欢
- 一、前言我们经常会遇到业务想看debug日志的问题,但是debug日志频繁打印会对日志查看有影响,且日志多对系统也会有一定的压力,因此,如果
- 最近在用ssm框架做一个管理系统,做到登录验证时,使用了下面的代码生成图片验证码,最终的效果如下图。Java类public class Ra
- 在Android开发中,我们经常使用列表控件,而有时候列表控件条目中又会是多条目数据,这时候,我们无法确定每个条目的数据多少,而为了美观,我
- 引言前边两章说了点基础的,从这章开始,我们挖挖源码。看看RocketMQ是怎么工作的。首先呢,这个生产者就是送孩子去码头的家长,孩子们呢,就
- C#异常处理总结及简单实例一、异常处理的理解?异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。因此处理这种错误,
- 目录前言实现思路其它总结前言本文将介绍如何通过使用EasyExcel自定义 * 实现在最终的Excel文件中新增一列自增的序号列,最终的效果
- 模式介绍命令模式(Command Pattern) :在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被
- 大家好,这一篇博客来教大家一个类似于LED闹钟显示屏样式的小案例,UI比较美观,文末会提供下载相关资源地址供大家下载,首先我们来看一看这个案
- 将通用算法放入具体类(HeapSorter),并将通用算法必须调用的方法定义在接口(HeapSorterHandle)中,从这个接口派生出D
- 1.发生问题的场景我在用java获取一个接口的大JSON字符串,并赋值给String常量时,遇到了java: 常量字符串过长这个报错2.解决
- 本文实例讲述了Java使用Socket通信传输文件的方法。分享给大家供大家参考,具体如下:前面几篇文章介绍了使用Java的Socket编程和
- 第一次写上传图片的代码,碰到很多问题。昨天做了整整一天,终于在晚上的时候成功了。大声欢呼。但是,做完之后,还是有很多问题想不通。所以在这里也
- 把spring-boot项目按照平常的web项目一样发布到tomcat容器下一、修改打包形式在pom.xml里设置 <packagin
- 非Web程序 1.AppDomain.CurrentDomain.BaseDirectory 2.Environment.CurrentDi
- 本文实例讲述了C#中HttpWebRequest的用法。分享给大家供大家参考。具体如下:HttpWebRequest类主要利用HTTP 协议
- 在调用一些简单的方法实现一系列的动作时,回退的问题比较重要。作为一款用户体验良好的产品而言,有回退功能将显得比较人性化,想想如果我们常用的w
- 先看一段同步代码:public int SumPageSizes(IList<Uri> uris) {
- 引言♀ 小AD:明哥,昨天气死我了,明哥要帮我出气。♂ 明世隐:咋了,有谁惹到你了。♀ 小AD:昨天辅助喷我小鲁班菜,我反手就对喷,然后竟然
- 在日常的开发中、我们都知道,Java的内存清理是通过垃圾回收器进行的,那么其是如何将没用的对象被被清理掉的呢?Java 语言的内存自动回收称
- 我们在开发中经常用到倒计时的功能,比如发送验证码后,倒计时60s再进行验证码的获取,为了方便以后使用,这里做个记录,讲讲倒计时器的实现。&n