vectra 发表于 2014-11-2 21:42:14

迭代函数示例,4个空瓶换一瓶饮料问题

本帖最后由 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)
(repeat100
(princ (strcat (itoa i) "\t" (itoa (test i)) "\r\n"))
(setq i (1+ i))
)

其中do函数是个递归函数(迭代的特例)。当输入变量n大于等于4时(可以继续换饮料),函数将调用自身,每次函数返回值到上次调用的函数体内,以实现汇总。

特别重要的,任何迭代函数都需要设置一个中止迭代的条件,本例中n<4时,将返回0并结束递归。


用1~101去测试可能满足条件的数值,然后人工进行判断,这又是试算和穷举的概念了。





自贡黄明儒 发表于 2014-11-2 21:52:50

有点意思,好贴

wowan1314 发表于 2014-11-3 01:02:43

赞一个!楼主继续。

ll_j 发表于 2014-11-3 09:11:30

迭代在这里也是递归的一种,被称为尾递归,计算速度高于普通的递归,但同样受堆栈的约束,迭代层数有限制(约20000),慎用。
我曾经发过一个关于递归的帖子,里面有类似的内容。

ynhh 发表于 2015-11-21 11:58:24

不知实际工作中
用在那里

QJGUANBA 发表于 2016-1-10 11:48:01

路过,看看啊
页: [1]
查看完整版本: 迭代函数示例,4个空瓶换一瓶饮料问题