【发布时间】:2012-10-11 09:23:35
【问题描述】:
我正在做一些功课,但我已经被困了好几个小时了。 我确信这真的很微不足道,但在挖掘了所有可用的文档后,我仍然无法理解它。 任何人都可以帮我一把吗? 基本上,OCaml 编程中的练习要求使用平方算法求幂来定义函数 x^n。
我已经查看了解决方案:
let rec exp x = function
0 -> 1
| n when n mod 2 = 0 -> let y = exp x (n/2) in y*y
| n when n mod 2 <> 0 -> let y = exp x ((n-1)/2) in y*y*x
;;
我特别不明白的是如何从 fun 语句中省略参数 n 以及为什么要将它用作与 x 匹配的变量,这与平方乘幂的定义没有明显的联系.
我会这样做:
let rec exp x n = match n with
0 -> 1
| n when (n mod 2) = 1 -> (exp x ((n-1)/2)) * (exp x ((n-1)/2)) * x
| n when (n mod 2) = 0 -> (exp x (n/2)) * (exp x (n/2))
;;
【问题讨论】:
-
如果您将第二个代码 sn-p 中
n的第一次和第二次出现更改为另一个变量名,但将其他变量名保留为n,则该代码仍然有效。你明白为什么吗? -
@sepp2k 是的,我知道我会使用一个变量来匹配 n 的材料。我不明白的是为什么第一个 sn-p 使用“函数”(据我所知,在这种情况下是“匹配 x 与”的语法糖)并且即使在我看来它也能工作,它会检查 x 的值,而不是函数定义所要求的 n 的值。
标签: functional-programming pattern-matching ocaml exponentiation