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)
请记住,这是第一周,所以我应该能够使用这些方法创建这些.
你的第一个片段主要有两个问题:
在F#中,float和之间存在差异int.您将整数值写为4或,0并将浮点值写为4.0或0.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.这意味着替换4为4.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)
另请注意,缩进很重要 - 您之前需要空格|.