Function 将公共Lisp中的-更改为+

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

有没有办法把负函数改成正函数

我的作业是在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) (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倍: