首先,我是函数式编程和F#的完全初学者。我开始学习一些基本的概念,并试图通过编写一个Mandelbrot设置程序来开始练习我的理解。函数iterate
应该接受一个元组,对它进行迭代,如果退出条件infinity
是med,它应该返回它所使用的迭代量i
。否则,它会用修改过的元组来调用自己。我收到以下错误:FS0001 Should be "int32", is "unit" instead
第2行
编辑: mandelbrot接受一个元组并返回一个元组;无穷大接受一个元组并返回一个整数
let rec iterate (a, b) :int32 =
for i:int32 in 0..100 do
(a, b)
|> mandelbrot
|> match infinity with
| a when a > 16 -> i
| a when a <= 16 -> iterate (a, b)
发布于 2020-07-19 19:13:02
很难猜出你想要实现什么。但是,只要做一些调整就可以编译。for do
需要一个返回unit
的函数,例如一个语句。
如果你想要迭代上百次,你可以使用一个变量i,你在迭代中传递,每次调用时增加它,然后用0(例如iterate (2,3) 0
)初始化它。
let mandelbrot (a,b) = (a,b)
let infinity (a,b) = a
let rec iterate (a, b) i :int =
(a, b)
|> mandelbrot
|> infinity
|> (fun a-> if i=100 then a else
match a with
| a when a > 16 -> i
| _ -> iterate (a,b) (i+1))
发布于 2020-07-19 22:05:07
在我试图不必要地解释这个函数之前,这里的代码是如何用C编写的:
整数迭代( int a,int b) { int i,ca = a,cb = b,aa,bb;
for (i = 0; i <= 100; i++) {
aa = a * a - b * b; //mandelbrot algorithm
bb = 2 * a * b;
a = aa + ca;
b = bb + cb;
//checks if the the values deviate to infinity
if ((a + b) > 16) {
return i;
}
}
}
我考虑过使用递归,但由于我不习惯函数范式,所以出于效率的考虑,我试图避免它,并且基本上尝试创建一个中断条件。结果,F#将尾递归编译为while循环,所以所有这些都是不必要的,而且是愚蠢的。https://gist.github.com/mrange/3a275cc643c9753925f1c8a68b0bd7a0
仍然希望它能帮助到一些人,并感谢所有试图从我写的代码中弄明白的人。
https://stackoverflow.com/questions/62982404
复制相似问题