计算递归次数
1.递归计算次数方法
import java.io.IOException;
public class Digui extends Thread {
public static void main(String[] args) {
//创建一个本身方法。
Digui instance = new Digui();
byte[] b = new byte[32];
//定义一个死循环。
while (true) {
try {
System.out.println("请输入正整数,获取其阶乘,输入over结束");
System.in.read(b);//控制台输入数据
String res = new String(b).trim();//将控制台输入的数据转为String并去除两端空格
if (res.equals("over")) {
System.out.println("程序结束");
break;
}
int i = Integer.parseInt(res.trim());//将控制台输入的转换为int类型
if (i <= 0) {
continue;
}
//调用factorial方法给递归次数赋初始值0。并开始调用递归方法
System.out.println(i + "!=" + instance.factorial(i));
//获取递归次数。
System.out.println("递归了 " + instance.getCount() + " 次");
} catch (IOException e) {
e.printStackTrace();
} catch (NumberFormatException ne) {
System.out.println("请输入正整数");
}
}
}
// 存递归次数的变量
private int count = 0;
//将递归次数返回给调用者
public int getCount() {
return count;
}
public long factorial(int i) {
// 将递归次数清零,若要统计所有的,则将count注释即可
count = 0;
//调用递归方法,并将递归次数结果返回。
return this.getResult(i);
}
//递归方法。计算递归次数。
public long getResult(int i) {
count++;
return i == 1 ? i : i * getResult(i - 1);
}
}
2.计算递归次数案例。
需求: 我使用一款软件,我可以将这个软件推荐给别人。别人可以再推荐给其他人,以此类推。我推荐的人属于我直接推荐的人,我推荐的人再推荐的人以此类推之后的所有推荐的人都算是我的间接推荐的人。计算我的直接和间接推荐的总人数。
2.1 创建一个可运行的web项目(步骤省略)
2.2 创建一个用户实体类
package com.sm.model;
public class User {
private Integer userId;//用户id
private Integer recommendUserId;//用户的推荐人的id
//即recommendUserId推荐了userId
private String phone;
private String password;
private Double balance;
private String headLink;
private Integer depositDay;
private String recommendLink;
private String recommendQrCodeUrl;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public Integer getRecommendUserId() {
return recommendUserId;
}
public void setRecommendUserId(Integer recommendUserId) {
this.recommendUserId = recommendUserId;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone == null ? null : phone.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
public String getHeadLink() {
return headLink;
}
public void setHeadLink(String headLink) {
this.headLink = headLink == null ? null : headLink.trim();
}
public Integer getDepositDay() {
return depositDay;
}
public void setDepositDay(Integer depositDay) {
this.depositDay = depositDay;
}
public String getRecommendLink() {
return recommendLink;
}
public void setRecommendLink(String recommendLink) {
this.recommendLink = recommendLink == null ? null : recommendLink.trim();
}
public String getRecommendQrCodeUrl() {
return recommendQrCodeUrl;
}
public void setRecommendQrCodeUrl(String recommendQrCodeUrl) {
this.recommendQrCodeUrl = recommendQrCodeUrl == null ? null : recommendQrCodeUrl.trim();
}
}
2.3 编写DAO层查询方法。
import java.util.List;
import com.sm.model.User;
public interface UserMapper {
//通过把用户id作为推荐人查询这个用户推荐的所有的人。
List<User> selectUserByRecommendUserId(Integer recommendUserId);
}
2.4 编写Mapper.xml层
<select id="selectUserByRecommendUserId" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
where recommend_user_id = #{recommendUserId,jdbcType=INTEGER}
</select>
2.5 编写Service层
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.sm.dao.UserMapper;
import com.sm.model.User;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public int selectUserByRecommendUserId(Integer recommendUserId){
//调用factorial方法。传递参数
this.factorial(recommendUserId);
System.out.println("递归了 " + this.getSum() + " 次");
//调用getSum方法单独获取返回值。
return this.getSum();
}
private int sum = 0;
//将sum值返回给调用者。
public int getSum() {
return sum;
}
public long factorial(int recommendUserId) {
// 将递归次数清零,若要统计所有的,则将count注释即可
sum = 0;
return this.getResult(recommendUserId);
}
//递归方法。
public long getResult(int recommendUserId) {
List<User> users = userMapper.selectUserByRecommendUserId(recommendUserId);
if(users.size() > 0) {
for (User user : users) {
int userId = user.getUserId();
sum += 1;
getResult(userId);
}
}
return sum;
}
}
2.6 编写Controller层
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.sm.service.UserService;
import com.sm.util.Msg;
@Controller
public class UserController {
@Autowired
private UserService userService;
/**
* 查询推荐的总人数。
* @param recommendUserId 推荐人的userId
* @return
*/
@RequestMapping("/numberPer")
@ResponseBody
public Msg numberPer(Integer recommendUserId) {
//调用service层的查询人数方法。并返回结果
int sum = userService.selectUserByRecommendUserId(recommendUserId);
return Msg.success().add("推荐总人数", sum);
}
}
2.7 用到的通用的返回值得工具类。
import java.util.HashMap;
import java.util.Map;
/**
* 通用的返回的类
*/
public class Msg {
//状态码 100-成功 200-失败
private int code;
//提示信息
private String msg;
//用户要返回给浏览器的数据
private Map<String, Object> extend = new HashMap<String, Object>();
private Object object;
public static Msg success(){
Msg result = new Msg();
result.setCode(100);
result.setMsg("处理成功!");
return result;
}
public static Msg success(Object object){
Msg result = new Msg();
result.setCode(100);
result.setMsg("处理成功!");
result.setObject(object);
return result;
}
public static Msg fail(){
Msg result = new Msg();
result.setCode(200);
result.setMsg("处理失败!");
return result;
}
//返回方法add()的定义
public Msg add(String key,Object value){
this.getExtend().put(key, value);
return this;
}
//返回方法add()的定义
public Msg addObject(Object obj){
this.setObject(obj);
return this;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Map<String, Object> getExtend() {
return extend;
}
public void setExtend(Map<String, Object> extend) {
this.extend = extend;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
2.8 数据库
/*
Navicat Premium Data Transfer
Source Server : MySql5.5
Source Server Type : MySQL
Source Server Version : 50562
Source Host : localhost:3306
Source Schema : cx
Target Server Type : MySQL
Target Server Version : 50562
File Encoding : 65001
Date: 14/10/2019 14:43:14
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`user_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`recommend_user_id` int(10) NULL DEFAULT NULL COMMENT '我的推荐人id',
`phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
`balance` double(30, 2) NULL DEFAULT 0.00 COMMENT '余额',
`head_link` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像链接',
`deposit_day` int(10) NULL DEFAULT NULL COMMENT '已存入天数',
`recommend_link` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '推广链接',
`recommend_qr_code_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '推广图片路径',
`crowd_funding_money` double(30, 2) NULL DEFAULT NULL COMMENT '众筹金额',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, NULL, '18912480392', '12345678', 100000002.00, '头像', 3, '推荐连接', '二维码', 25.00);
INSERT INTO `user` VALUES (2, 1, '12345678998', '65498', 65498.00, '玩儿', 2, '玩儿', '玩儿', 23.00);
INSERT INTO `user` VALUES (3, 5, '32165498654', '32165', 65498.00, '二阿哥', 12, '委屈', '为期二天', 65.00);
INSERT INTO `user` VALUES (4, 1, '98746549876', '34654', 987618.00, '东方红', 6, '图', '无一人头', 76.00);
INSERT INTO `user` VALUES (5, 2, '64546587654', '16465', 65498.00, '法规及', 9, '而已', '多个', 88.00);
INSERT INTO `user` VALUES (6, 3, '65498465184', '94654', 98494.00, '等会是', 5, '矮冬瓜', '敢', 23.00);
INSERT INTO `user` VALUES (7, 3, '98798466548', '98716', 235.00, '到公司', 3, '多个', '电饭锅', 56.00);
SET FOREIGN_KEY_CHECKS = 1;