为什么递归函数中的计数总是需要两个参数?

Eva*_*van 0 lisp recursion scheme

我用递归和循环宏编写了一些简单的循环,但令我困扰的是,递增计数需要两个参数,递减计数不需要。

是否存在示例?

这个问题的开始只是如何打印递增的内容。我的第一个功能是“ printsomestuff”。

(defun printsomestuff (stuff times) 
  (if (= times 0)
      'im-the-return-value
      (progn 
        (print stuff)
        (printsomestuff stuff (1- times)))))

(defun counting-down (topnumber)
  (if (= topnumber 0)
      'done
      (progn 
        (print topnumber)
        (counting (- topnumber 1)))))


(defun loopcounting (uptonumber)
  (loop for i from 1 to uptonumber
    do (print i)))

(defun recurcounting-up (uptonumber)
  (let ((incrementer 0))
    (if  
     (= incrementer uptonumber)
     'done
     (progn 
       (print incrementer)
       (recurcounting-up (+ incrementer 1))))))

(defun recur-counting-up-two (uptonumber startnumber)
  (if (> startnumber uptonumber)
      'done
      (progn
        (print startnumber)
        (recur-counting-up-two uptonumber (+ startnumber 1)))))
Run Code Online (Sandbox Code Playgroud)

recurcounting-up无限循环为0,因为每次函数调用都将重置增量器。那不是我想要的。

Bar*_*mar 7

这与您是递增还是递减无关。问题是递归的基本情况是可以在函数中进行硬编码还是需要作为参数提供。在倒数示例中,您总是以结尾0,因此它不必是参数-您只需为当前数字添加参数。但是在您的递增示例中,结束号无法放入代码中,因此需要将其作为第二个参数。

如果您一直计数到100,则可以像倒数示例一样编写代码。同样,如果您想倒数一个任意数字,而不仅仅是0,则需要两个参数。