【问题标题】:Max int in list ocamlocaml 列表中的最大 int
【发布时间】:2020-06-21 14:47:59
【问题描述】:

我想在一个 int 列表中找到最大元素。 我们的想法是只给find_max 打一次电话,然后让support 来做脏活。 函数support返回一个int,第一个值为0,然后当找到一个新的max时,它的值被保存,添加到结果中,之前的最大值被改变并从结果中减去它的值。

这是因为:

old_max = x
result = 0 + old_max

找到一个新的最大值:

new_max= y
result = result - oldmax + new_max

所以我会保存new_max 的值:

0 + old_max - old_max + new_max = new_max`.

显然上面的代码是解释性的,这是我的真实代码:

let find_max random  = 
  let rec support rlist max =
    if rlist==[] then 0
    else 
      if (List.hd rlist) > max 
      then -max + (List.hd rlist) + support (List.tl rlist) (List.hd rlist)
      else support (List.tl rlist) max ;;
  let return = support random 0 0 ;
  !return;;

let a = [1;2;3];
print_string "max element in list is : "
print_int (find_max a);
print_string "\n"

错误在第 9 行 !return;;,语法错误(显然是 :/)在 ;;

【问题讨论】:

  • 嘿,您现在已经问了三个问题(其他问题是 stackoverflow.com/q/62484643/20371stackoverflow.com/q/62497947/20371 ),答案是一样的:没有正确使用 let ... in ... 语法。这在您的第一个问题的答案中得到了很好的解释:stackoverflow.com/a/62488711/20371。我认为你最好去仔细阅读以内化它,并熟悉基本的语法规则。
  • 嗨@Yawar,是的,我知道我有点压力,对此感到抱歉。但是现在我(或多或少)了解了如何使用“let...in”。 Ocaml 的官方文档不太好我从这里读到它:ocaml.org/learn/tutorials/basics.html 但这些天我学到了很多东西。看看我最近的问题,你会发现我会变得更好(我希望):stackoverflow.com/questions/62531154/…。我还需要 1-2 样东西,我得到了。

标签: ocaml


【解决方案1】:

OCaml 中没有构造let ... = ...;,本地定义使用let .. = ... in ... 。作为初学者,您可能也希望完全避免使用;;

另外,结构平等是= 而不是==。同样,作为初学者,您应该永远在代码中使用List.hdList.tl。模式匹配始终是最佳选择。 通常,这些函数的所有用法都可以用一个简单的替换:

match rlist with
| [] -> 0
| hd :: tl -> ...

它更短、更清晰,并且消除了任何错误处理空列表的可能性。 您的逻辑也不必要地复杂,而不是计算 max - initial_value

-max + hd + support tl hd

你可以直接计算最大值

hd

然后你打电话给支持support 有太多参数。 我们可能想在计算效果时使用let () = ... ,而不是使用;;

【讨论】:

  • 我在 'match' 及其案例方面遇到了一些麻烦...这种编程对我来说有点难...我更喜欢 C、C++、Java...这对我来说很奇怪...您知道我在哪里可以阅读并了解更多以了解这种编程语言背后的机制吗?对我来说很难专注于机制......
  • 我想你看到了我像 C、Java 一样编写代码......我仍然没有获得函数式编程风格,但我想要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多