迭代函数示例,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去测试可能满足条件的数值,然后人工进行判断,这又是试算和穷举的概念了。
有点意思,好贴 赞一个!楼主继续。 迭代在这里也是递归的一种,被称为尾递归,计算速度高于普通的递归,但同样受堆栈的约束,迭代层数有限制(约20000),慎用。
我曾经发过一个关于递归的帖子,里面有类似的内容。 不知实际工作中
用在那里 路过,看看啊
页:
[1]