F# search函数定义问题:如何返回匹配元素的索引而非列表
解决F#中search函数返回索引的问题
嘿,作为F#新手碰到这个问题太正常了,我来帮你捋清楚怎么改!
你的核心问题是:当前代码在找到匹配项时返回的是剩余列表,但我们需要的是元素的索引值——之所以会这样,是因为你没有在递归过程中跟踪当前处理到第几个元素。
问题根源
你原来的递归函数只处理了列表本身,没有记录当前的索引位置。当找到匹配的head时,你返回了list(也就是从当前元素开始的子列表),但我们需要的是这个元素在原列表里的位置序号(从0开始计数)。
解决方案:加一个跟踪索引的辅助递归函数
我们可以写一个内部的辅助函数,额外接收一个idx参数来记录当前处理到的索引位置,从0开始:
let search f list = // 内部辅助函数,跟踪当前索引和剩余列表 let rec searchWithIndex idx remaining = match remaining with | [] -> -1 // 列表遍历完没找到,返回-1 | head::tail -> if f head then idx // 找到匹配项,直接返回当前索引 else searchWithIndex (idx + 1) tail // 没找到,递归处理下一个元素,索引+1 // 调用辅助函数,初始索引为0 searchWithIndex 0 list
测试你的示例
现在跑你给的两个例子,结果完全符合预期:
search (fun x -> x > 10) [ 2; 12; 3; 23; 62; 8; 2 ]→ 返回1(第二个元素,索引从0开始)search (fun s -> s < "horse") [ "pig"; "lion"; "horse"; "cow"; "turkey" ]→ 返回3(这里要注意:F#的字符串比较是字典序,"cow"的首字母'c' ASCII码比'h'小,所以它是第一个满足s < "horse"的元素,对应索引3)
为什么这个方法可行?
通过内部辅助函数,我们在每一步递归时都带着当前的索引值:一开始处理第一个元素时索引是0,没匹配就加1处理第二个元素,直到找到匹配项就返回当时的索引,遍历完所有元素都没找到就返回-1。
这样就完美解决了你原来的问题,不用再纠结返回列表还是索引啦!
内容的提问来源于stack exchange,提问作者S.Elizabeth
相关产品推荐
相关产品推荐

