SML高阶函数问题:factorize因式分解函数与柯里化cfoldl实现求助
问题1:factorize函数实现
你可以通过递归生成1到输入值的所有正整数序列,再筛选出能整除输入值的元素来实现,不需要依赖外部传入的候选列表,基础实现代码如下:
fun factorize n = let (* 辅助函数从1开始遍历到n,筛选符合要求的因数 *) fun aux i = if i > n then [] else if n mod i = 0 then i :: aux (i + 1) else aux (i + 1) in aux 1 end
测试验证:运行factorize 12会直接返回[1,2,3,4,6,12],符合要求。如果需要提升大数计算效率,可以调整为遍历到sqrt(n)后配对生成因数,上述写法适合基础需求。
问题2:cfoldl函数修复
你现有代码的问题是参数传递逻辑不匹配:题目要求入参函数f是柯里化函数,不需要传入二元组,你写的f (x, b)是给接收二元组的非柯里化函数传参的写法,调整为柯里化传参即可,修正后代码如下:
fun cfoldl f b [] = b | cfoldl f b (x::xs) = cfoldl f (f x b) xs;
测试验证:运行cfoldl (fn a => fn b => a-b) 1 [1,2,3,4]的计算过程为:
- 初始累加值为1,取第一个元素1,计算
1 - 1 = 0 - 累加值更新为0,取第二个元素2,计算
2 - 0 = 2 - 累加值更新为2,取第三个元素3,计算
3 - 2 = 1 - 累加值更新为1,取第四个元素4,计算
4 - 1 = 3
最终返回结果为3,符合要求。
内容的提问来源于stack exchange,提问作者Reddy
相关产品推荐
相关产品推荐

