F#中如何处理seq<seq<int>>,获取各Collatz序列的停止时间
解决嵌套Collatz序列的停止时间计算问题
你需要对嵌套序列中的每一个子序列单独调用Seq.findIndex,而非直接在外层序列上使用。原代码失败的原因是:collatzSequences是seq<seq<int>>类型,Seq.findIndex参数函数里的i是一个子序列(seq<int>),无法直接和整数1做比较。
具体实现步骤
- 先定义一个计算单个Collatz序列停止时间的函数:
let getStoppingTime collatzSeq = // 找到序列中首次出现1的索引 collatzSeq |> Seq.findIndex (fun num -> num = 1)
- 对嵌套序列使用
Seq.map,逐个处理每个子序列:
// 得到所有正整数对应的Collatz序列停止时间组成的序列 let allStoppingTimes = collatzSequences |> Seq.map getStoppingTime
验证示例
比如单独计算初始值为5的序列停止时间:
collatz 5 |> getStoppingTime // 返回5,因为序列是5→16→8→4→2→1,1在索引5的位置
allStoppingTimes会依次生成初始值1、2、3...对应的停止时间:
- 初始值1的序列:
[1;4;2;1;...],首次1在索引0,所以第一个元素是0 - 初始值2的序列:
[2;1;4;2;...],首次1在索引1,所以第二个元素是1 - 以此类推
内容的提问来源于stack exchange,提问作者Ibo
相关产品推荐
相关产品推荐

