Function 将公共Lisp中的-更改为+
有没有办法把负函数改成正函数 我的作业是在Macluaurin系列上实现sin计算Function 将公共Lisp中的-更改为+,function,lisp,common-lisp,Function,Lisp,Common Lisp,有没有办法把负函数改成正函数 我的作业是在Macluaurin系列上实现sin计算 sin(x) = x-(x^3/3!)+(x^5/5!) -(x^7/7!)+(x^9/9!)-... 每件物品都有不同的标志。这是我的Lisp代码 (defun sinMac (x series n plusminus) (cond ((= series 0) 0) (t (funcall plusminus (/ (power x n) (fact
sin(x) = x-(x^3/3!)+(x^5/5!) -(x^7/7!)+(x^9/9!)-...
每件物品都有不同的标志。这是我的Lisp代码
(defun sinMac (x series n plusminus)
(cond ((= series 0) 0)
(t (funcall plusminus
(/ (power x n) (factorial n))
(sinMac x (- series 1) (+ n 2) plusminus)))))
是否可以将plusminus更改为交换符号?如果我得到“+函数send”-到下一个递归调用。从那次通话中,你得到了“-I call”+等等……你可以通过循环列表来完成。像这样:
(defun sin-mac (x series n plus-minus)
(cond ((zerop series) 0)
(t (funcall (car plus-minus)
(/ (power x n) (factorial n))
(sin-mac x (1- series) (+ n 2) (cdr plus-minus))))))
(sin-mac x series 1 '#0=(+ - . #0#))
或者更好的方法是,使用标签包装初始参数:
你可以用循环列表来做。像这样:
(defun sin-mac (x series n plus-minus)
(cond ((zerop series) 0)
(t (funcall (car plus-minus)
(/ (power x n) (factorial n))
(sin-mac x (1- series) (+ n 2) (cdr plus-minus))))))
(sin-mac x series 1 '#0=(+ - . #0#))
或者更好的方法是,使用标签包装初始参数:
如果函数是一个符号,这很容易:
(defun next-function (function)
(ecase function
(+ '-)
(- '+)))
(defun sinMac (x series n plusminus)
(cond ((= series 0) 0)
(t (funcall plusminus
(/ (power x n) (factorial n))
(sinMac x
(- series 1)
(+ n 2)
(next-function plusminus))))))
如果函数是一个符号,这很容易:
(defun next-function (function)
(ecase function
(+ '-)
(- '+)))
(defun sinMac (x series n plusminus)
(cond ((= series 0) 0)
(t (funcall plusminus
(/ (power x n) (factorial n))
(sinMac x
(- series 1)
(+ n 2)
(next-function plusminus))))))
我不会交换功能,只交换标志。对我来说,使用循环似乎更清晰,也更有可能更高效,尽管仍有大量优化机会:
(defun maclaurin-sinus (x n)
"Calculates the sinus of x by the Maclaurin series of n elements."
(loop :for i :below n
:for sign := 1 :then (- sign)
:sum (let ((f (1+ (* 2 i))))
(* sign
(/ (expt x f)
(factorial f))))))
在n=5的情况下,一些优化使测试速度提高了约10倍:
我不会交换功能,只交换标志。对我来说,使用循环似乎更清晰,也更有可能更高效,尽管仍有大量优化机会:
(defun maclaurin-sinus (x n)
"Calculates the sinus of x by the Maclaurin series of n elements."
(loop :for i :below n
:for sign := 1 :then (- sign)
:sum (let ((f (1+ (* 2 i))))
(* sign
(/ (expt x f)
(factorial f))))))
在n=5的情况下,一些优化使测试速度提高了约10倍: