gpt4 book ai didi

functional-programming - 在 OCaml 中的每次递归调用中保留一个计数器

转载 作者:行者123 更新时间:2023-12-04 22:07:04 25 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数返回给定列表 v 中传递值 x 的索引; -1 如果没有找到。我对解决方案的尝试:

let rec index (x, v) =
let i = 0 in
match x with
[] -> -1
| (curr::rest) -> if(curr == v) then
i
else
succ i; (* i++ *)
index(rest, v)
;;

这对我来说显然是错误的(它每次都会返回 -1),因为它在每次传递时都重新定义了 i。我有一些晦涩的方法,在我的脑海中用单独的函数来做这件事,目前我无法写下来。我知道这是所有编程中的常见模式,所以我的问题是,在 OCaml 中执行此操作的最佳方法是什么?

最佳答案

你不能在 OCaml 中改变变量(嗯,有一种方法,但你真的不应该像这样的简单事情)

您可以做的一个基本技巧是创建一个辅助函数,该函数接收与您要“变异”的变量相对应的额外参数。请注意我是如何为 i 添加额外参数的,并以类似的方式“变异”当前列表头。

let rec index_helper (x, vs, i) =
match vs with
[] -> -1
| (curr::rest) ->
if(curr == x) then
i
else
index_helper (x, rest, i+1)
;;

let index (x, vs) = index_helper (x, vs, 0) ;;

这种尾递归转换是一种将循环转换为函数式编程的方法,但老实说它是低级的(您拥有全部功能,但手动递归看起来像使用 goto 编程......)。

对于某些特定模式,您可以尝试做的是利用可重用的高阶函数,例如 map 或 folds。

关于functional-programming - 在 OCaml 中的每次递归调用中保留一个计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9846593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com