明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2263|回复: 5

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

[复制链接]
发表于 2014-11-2 21:42 | 显示全部楼层 |阅读模式
本帖最后由 vectra 于 2014-11-2 22:11 编辑

如买10瓶饮料,每4个空瓶可以换一瓶新饮料,10个空瓶可以换2瓶,余2个空瓶和新换的2瓶又可以换一瓶饮料,一共可以得到10+2+1共13瓶饮料。问,如最终要100瓶饮料,至少要先买多少瓶?

这是个典型的迭代过程,可以用下面的LISP函数求解出买1~101瓶最终可以换成多少瓶。

  1. (defun do (n /)
  2.   (if (>= n 4)
  3.     (+ (fix (/ n 4)) (do (+ (fix (/ n 4)) (rem n 4))))
  4.     0
  5.   )
  6. )

  7. (defun test (n)
  8.   (+ n (do n))
  9. )

  10. (setq i 1)
  11. (repeat  100
  12.   (princ (strcat (itoa i) "\t" (itoa (test i)) "\r\n"))
  13.   (setq i (1+ i))
  14. )


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

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


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





"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-11-2 21:52 来自手机 | 显示全部楼层
有点意思,好贴
发表于 2014-11-3 01:02 来自手机 | 显示全部楼层
赞一个!楼主继续。

点评

葛老又出山了啊,热烈欢迎。  发表于 2014-11-3 09:30
发表于 2014-11-3 09:11 | 显示全部楼层
迭代在这里也是递归的一种,被称为尾递归,计算速度高于普通的递归,但同样受堆栈的约束,迭代层数有限制(约20000),慎用。
我曾经发过一个关于递归的帖子,里面有类似的内容。
发表于 2015-11-21 11:58 | 显示全部楼层
不知实际工作中
用在那里
发表于 2016-1-10 11:48 | 显示全部楼层
路过,看看啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-20 18:54 , Processed in 0.215655 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表