本帖最后由 vectra 于 2014-11-2 22:11 编辑
如买10瓶饮料,每4个空瓶可以换一瓶新饮料,10个空瓶可以换2瓶,余2个空瓶和新换的2瓶又可以换一瓶饮料,一共可以得到10+2+1共13瓶饮料。问,如最终要100瓶饮料,至少要先买多少瓶?
这是个典型的迭代过程,可以用下面的LISP函数求解出买1~101瓶最终可以换成多少瓶。
- (defun do (n /)
- (if (>= n 4)
- (+ (fix (/ n 4)) (do (+ (fix (/ n 4)) (rem n 4))))
- 0
- )
- )
- (defun test (n)
- (+ n (do n))
- )
- (setq i 1)
- (repeat 100
- (princ (strcat (itoa i) "\t" (itoa (test i)) "\r\n"))
- (setq i (1+ i))
- )
其中do函数是个递归函数(迭代的特例)。当输入变量n大于等于4时(可以继续换饮料),函数将调用自身,每次函数返回值到上次调用的函数体内,以实现汇总。
特别重要的,任何迭代函数都需要设置一个中止迭代的条件,本例中n<4时,将返回0并结束递归。
用1~101去测试可能满足条件的数值,然后人工进行判断,这又是试算和穷举的概念了。
|