介绍F#(斐波那契和函数表达式)

Mar*_*our 1 f# expression functional-programming function fibonacci

我已经开始介绍F#的课程了,我在两个作业中遇到了一些麻烦.第一个让我创建两个函数,其中第一个函数接受输入并将其添加四个,第二个函数计算sqrt(x ^ 2 + y ^ 2).然后我应该为它们写两个函数表达式,但由于某种原因它给了我错误"Unexpected symbol'|' 在实施文件中".

let g = fun n -> n + 4;;

let h = fun (x,y) -> System.Math.Sqrt((x*x)+(y*y));;

let f = fun (x,n) -> float
|(n,0) -> g(n)
|(x,n) -> h(x,n);;
Run Code Online (Sandbox Code Playgroud)

第二个赋值要求我创建一个函数,它找到Fibonaccis数的序列.我写了下面的代码,但它似乎忘记了开头的0,因为输出总是n + 1而不是n.

let rec fib = function
|0 -> 0
|1 -> 1
|n -> fib(n-1) + fib(n-2)
;;
Run Code Online (Sandbox Code Playgroud)

请记住,这是第一周,所以我应该能够使用这些方法创建这些.

Tom*_*cek 5

你的第一个片段主要有两个问题:

  • 在F#中,float和之间存在差异int.您将整数值写为4或,0并将浮点值写为4.00.0.F#不会自动将整数转换为浮点数,因此您需要保持一致.

  • 你在f函数中的语法有点奇怪 - 我不确定那里float应该是什么意思,fun并且function构造的行为有所不同.

因此,从您的原始代码开始:

let g = fun n -> n + 4;;
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我不会将其作为显式函数使用fun- 您也可以使用它let来定义函数,它更简单.此外,您只需要;;在F#Interactive中,但如果您使用任何合适的编辑器来命令将代码发送到F#interactive(通过Alt + Enter),则不需要.

但是,在您的f函数中,您希望返回,float因此您需要修改g以返回float.这意味着替换44.0:

let g n = n + 4.0
Run Code Online (Sandbox Code Playgroud)

h功能是好的,但你可以用再写一遍let:

let h (x,y) = System.Math.Sqrt((x*x)+(y*y));;
Run Code Online (Sandbox Code Playgroud)

在您的f函数中,您可以function使用模式匹配来编写函数,也可以使用更详细的语法match(function只是编写函数的简写,然后是输入上的模式匹配):

let f = function
  | (n,0.0) -> g(n)
  | (x,n) -> h(x,n)

let f (x, y) = 
  match (x, y) with
  | (n,0.0) -> g(n)
  | (x,n) -> h(x,n)
Run Code Online (Sandbox Code Playgroud)

另请注意,缩进很重要 - 您之前需要空格|.