go中阶乘实现时递归及迭代方式的比较

embedded/2024/10/22 10:07:09/
package mainimport ("fmt""time""math/big"
)// 使用递归和 big.Int 计算阶乘
func FactorialRecursive(n *big.Int) *big.Int {if n.Cmp(big.NewInt(0)) == 0 {return big.NewInt(1)}return new(big.Int).Mul(n, FactorialRecursive(new(big.Int).Sub(n, big.NewInt(1))))
}// 使用迭代和 big.Int 计算阶乘
func FactorialIterative(n *big.Int) *big.Int {result := big.NewInt(1)for i := big.NewInt(2); i.Cmp(n) <= 0; i.Add(i, big.NewInt(1)) {result.Mul(result, i)}return result
}func main() {n := big.NewInt(2000)// 递归方法start := time.Now()resultRecursive := FactorialRecursive(new(big.Int).Set(n))durationRecursive := time.Since(start)fmt.Printf("递归计算 %s 的阶乘结果长度: %d 位\n", n, len(resultRecursive.String()))fmt.Printf("递归计算执行时间: %v\n", durationRecursive)// 迭代方法startIterative := time.Now()resultIterative := FactorialIterative(new(big.Int).Set(n))durationIterative := time.Since(startIterative)fmt.Printf("迭代计算 %s 的阶乘结果长度: %d 位\n", n, len(resultIterative.String()))fmt.Printf("迭代计算执行时间: %v\n", durationIterative)// 验证两种方法的结果是否相同if resultRecursive.Cmp(resultIterative) == 0 {fmt.Println("两种方法的结果相同")} else {fmt.Println("错误:两种方法的结果不同")}
}

结果

PS E:\studygo> go run .\chengji.go
递归计算 2000 的阶乘结果长度: 5736 位
递归计算执行时间: 1.6225ms
迭代计算 2000 的阶乘结果长度: 5736 位
迭代计算执行时间: 514.6µs
两种方法的结果相同
PS E:\studygo> go run .\chengji.go
递归计算 2000 的阶乘结果长度: 5736 位
递归计算执行时间: 1.5059ms
迭代计算 2000 的阶乘结果长度: 5736 位
迭代计算执行时间: 0s
两种方法的结果相同


http://www.ppmy.cn/embedded/129530.html

相关文章

docker部署AI证件照工具 —— 筑梦之路

GitHub&#xff1a;https://github.com/Zeyi-Lin/HivisionIDPhotos 简介 一款开源的图片处理工具&#xff0c;可以利用AI模型对照片进行轻量级智能抠图、调整尺寸生成不同的标准证件照、替换背景、美颜、智能换正装等操作。 安装部署 docker run -d -p 7860:7860 linzeyi/hiv…

jeston编译配置cuda加速版opencv

1.源码下载连接 opencv&#xff1a;Releases - OpenCV opencv-contrib&#xff1a; https://github.com/opencv/opencv_contrib 建议不要下最新版本 一般我会下4.5.4 // 4.5.6 // 4.6.0 opencv和opencv-contrib版本要对齐 将下好的opencv和opencv-contrib解压 将opencv-c…

Git的原理和使用(五)

场景&#xff1a; 目标&#xff1a;远程master分支下新增function1和function2文件&#xff1b; 实现&#xff1a;由开发者1新增function1&#xff0c;由开发者2新增function2&#xff1b; 条件&#xff1a;在不同分支下协作完成&#xff1b;各自让某一个功能私有某一个分支&am…

MySQL数据库操作——(4)

目录 8 视图 8.1 常见的数据库对象 8.2 视图概述 8.2.1 为什么使用视图&#xff1f; 8.2.2 视图的理解 8.3 创建视图 8.3.1 创建单表视图 8.3.2 创建多表联合视图 8.3.3 基于视图创建视图 8.4 查看视图 8.5 更新视图的数据 8.5.1 一般情况 8.6 修改、删除视图 8.…

Vue 项目中 Webpack 常见问题详解

前言 在Vue.js项目中&#xff0c;Webpack 作为打包工具&#xff0c;处理各种静态资源和模块化的代码打包需求。尽管 Webpack 在 Vue CLI 项目中已经配置好了一些默认行为&#xff0c;但开发者在实际项目中仍然会遇到许多与资源管理、public 和 assets 目录、require 语法等相关…

使用verilog设计实现的数字滤波器(低通、高通、带通)及其仿真

以下是一个简单的使用Verilog设计数字滤波器(以有限脉冲响应(FIR)滤波器为例,实现低通、高通、带通滤波器)的基本步骤和代码框架: 一、FIR滤波器原理 FIR滤波器的输出 y [ n ] y[n] y[n] 是输入信号

大数据治理:从挑战到最佳实践

引言 随着大数据技术的快速发展,各类组织和企业积累了海量的数据资产。然而,数据的复杂性、异构性和庞大规模也带来了数据管理和利用的诸多挑战。为了确保数据的高效利用、安全性以及合规性,大数据治理应运而生。大数据治理不仅仅是管理数据的存储和处理,它更是一项系统性…

【网络安全】从NA到P1,我是如何扩大思路的?

未经许可,不得转载。 文章目录 正文正文 在这篇文章中,我将向大家展示一个我发现的漏洞,该漏洞利用了一个硬编码的 Basic 认证头,获取了管理员权限。 首先,假设公司域名为“target.com”。 第一步是使用多种工具(如 Amass、subfinder、findomain 等)收集与该组织相关…