这是我的问题:我需要一个 Haskell 函数来计算某个数字的正弦的近似值,使用相关的 Taylor serie ...
在 C++ 中,我写了这个:
double msin(double number, int counter = 0, double sum = 0)
{
// sin(x) = x - (x'3 / 3!) + (x'5 / 5!) - (x'7 / 7!) + (x'9 / 9!)
if (counter <= 20)
{
if (counter % 2 == 0)
sum += mpow(number, counter * 2 + 1) / mfak(counter * 2 + 1) ;
else
sum -= mpow(number, counter * 2 + 1) / mfak(counter * 2 + 1) ;
counter++;
sum = msin(number, counter, sum);
return sum;
}
return (sum* 180.0 / _PI);
}
现在我正在尝试在 Haskell 中做到这一点,但我不知道如何......现在我正在尝试这样的事情(它并没有真正起作用,但它正在进行中;)):
这有效:
mfak number = if number < 2
then 1
else number *( mfak (number -1 ))
mpow number potenca = if potenca == 0
then 0
else if potenca == 1
then 1
else (number * (mpow number (potenca-1)))
这不起作用:
msin :: Double -> Int -> Double -> Double
msin number counter sum = if counter <= 20
then if counter `mod` 2==0
then let sum = sum + (msin 1 (let counter = counter+1 in counter) sum) in sum
else let sum = sum + (msin 1 (let counter = counter+1 in counter) sum) in sum
else sum* 180.0 / 3.14
已更新....无法编译:/“无法匹配预期Double' with actual type
的 Int 类型”
msin :: Double -> Int -> Double -> Double
msin number counter sum = if counter <= 20
then if counter `mod` 2==0
then let sum' = sum + ((mpow number (counter*2+1))/(mfak counter*2+1)) in msin number (counter+1) sum'
else let sum' = sum - ((mpow number (counter*2+1))/(mfak counter*2+1)) in msin number (counter+1) sum'
else sum* 180.0 / 3.14
如您所见,最大的问题是如何在“sum”中添加一些东西,增加“counter”并使用这些新值再次递归......
PS我是Haskell的新手,所以尽可能多地解释你的解决方案。我正在阅读一些教程,但是我找不到如何将某些表达式的结果保存到一个值中,然后在它之后继续其他代码......每次我尝试这样做时它都会返回我的值,并且我不想要那个......
所以提前感谢您的帮助!