Golang笔试题:编写一个函数,接收一个整数参数n,输出n的阶乘结果

今天,我们开发的AI笔试题工具,ai扁食------AI程序员笔试系统给我出了中级Golang题目,就是这道题:《请编写一个函数,接收一个整数参数n,输出n的阶乘结果》,希望我写一个函数,输出n的阶乘结果。我开始的时候没觉得有什么问题,大概写了个实现如下:

复制代码
// 循环计算n的阶乘
func factorial(n int) int {
	var result = 1
	for i := 1; i <= n; i++ {
		result *= i
	}
	return result
}

或者使用递归也行:

复制代码
// 计算n的阶乘
func factorial1(n int) int {
	if n == 1 {
		return 1
	}
	return n * factorial1(n-1)
}

后来觉得不对,这看起来不像一个中级题目啊。

跑了个简单测试例,发现这两个实现居然在21的时候就溢出int了。

复制代码
21的阶乘是-4249290049419214848
21的阶乘是-4249290049419214848

哦,果然隐藏了一个考点。

那golang其实给我们提供了一个大数库:

math.Big

Big库的循环实现版本如下:

复制代码
// 计算n的阶乘,使用math/big包
func factorial3(n int) *big.Int {
	var result = big.NewInt(1)
	for i := 1; i <= n; i++ {
		result.Mul(result, big.NewInt(int64(i)))
	}
	return result
}

或者递归版本

复制代码
// 计算n的阶乘,使用math/big包,递归实现
func factorial8(n int) *big.Int {
	if n == 1 {
		return big.NewInt(1)
	}
	var result = big.NewInt(int64(n))
	return result.Mul(result, factorial8(n-1))
}

最终选择提交了循环版本,递归版本在递归深度较深的时候有非必要的消耗,循环就好。

相关推荐
kobesdu3 分钟前
laser_line_extraction线段提取开源功能包解读和使用例程
人工智能·算法·机器人·ros
abant24 分钟前
leetcode 105 前序中序构建二叉树
算法·leetcode·职场和发展
6Hzlia9 分钟前
【Hot 100 刷题计划】 LeetCode 438. 找到字符串中所有字母异位词 | C++ 滑动窗口题解
c++·算法·leetcode
Mr_Xuhhh19 分钟前
深入理解Java数组:从定义到高阶应用
开发语言·python·算法
倦王21 分钟前
力扣日刷复习:
算法·leetcode·职场和发展
py有趣24 分钟前
力扣热门100题之二叉树的中序遍历
算法·leetcode·职场和发展
DFT计算杂谈29 分钟前
eDMFT安装教程
java·服务器·前端·python·算法
我不是懒洋洋30 分钟前
【数据结构】单链表专题(详细代码及配图)
c语言·数据结构·c++·算法·visual studio
j_xxx404_31 分钟前
蓝桥杯--搜索(DFS基础回溯法,剪枝,记忆化搜索)
数据结构·c++·算法·蓝桥杯·深度优先·图论
AI-小柒33 分钟前
大模型API中转推荐:Dataeyes API 600+模型统一网关与负载均衡部署,claude编程、香蕉生图、视频大模型聚合平台
大数据·运维·开发语言·人工智能·算法·机器学习·负载均衡