SICP 换零钱的迭代版本
2016-05-01 13:18
274 查看
看到换零钱方式统计这里, 书中给出了递归的实现但没有给出迭代版本说要留给读者作为挑战, 既然说是作为挑战那肯定是能解决的,在想了一天无果之后最终在别人博客的帮助下终于实现了迭代的版本...也算是经历坎坷...下面是c语言的实现代码,参照的是这位大神的思路,饮水思源这里附上链接: http://www.jianshu.com/p/3e7477ab72de
C代码如下(匆忙实现没有注释很少,凑合着看) --> 过两天再改成scheme代码,今天懒得弄了...:
C代码如下(匆忙实现没有注释很少,凑合着看) --> 过两天再改成scheme代码,今天懒得弄了...:
#include <stdio.h> int count = 0; int flag = 1; // ---> 主要用来标注是在状态1还是状态2....(原文中的游标是右移动还是左移动) int cal(int a1, int a2, int a3, int a4, int a5); void update(int total, int a1, int a2, int a3, int a4, int a5, int index); void helper(int total, int a1, int a2, int a3, int a4, int a5, int index); void update(int total, int a1, int a2, int a3, int a4, int a5, int index){ if(flag){ if(index == 0){ helper(total, a1-1, a2+1, a3, a4, a5, 1); }else if(index == 1){ helper(total, a1, a2-1, a3+1, a4, a5, 2); }else if(index == 2){ helper(total, a1, a2, a3-1, a4+1, a5, 3); }else if(index == 3){ helper(total, a1, a2, a3, a4-1, a5+1, 4); }else{ flag = 0; count--; helper(total, a1, a2, a3, a4, a5, 4); } }else{ flag = 1; if(a4 != 0){ helper(total, a1, a2, a3, a4-1, a5+1, 4); }else if(a3 != 0){ helper(total, a1, a2, a3-1, a4+1, 0, 3); }else if(a2 != 0){ helper(total, a1, a2-1, a3+1, 0, 0, 2); }else if(a1 != 0){ helper(total, a1-1, a2+1, 0, 0, 0, 1); }else{ helper(total, a1, a2, a3, a4, a5+1, 0); } } } int cal(int a1, int a2, int a3, int a4, int a5){ return 50 * a1 + 25 * a2 + 10 * a3 + 5 * a4 + a5; } void helper(int total, int a1, int a2, int a3, int a4, int a5, int index){ if(a1 == 0 && a2 == 0 && a3 == 0 && a4 == 0 && cal(a1, a2, a3, a4, a5) > total){ return; } else{ if(cal(a1, a2, a3, a4, a5) == total){ count++; update(total, a1, a2, a3, a4, a5, index); } else if(cal(a1, a2, a3, a4, a5) < total){ if(index == 0){ helper(total, a1+1, a2, a3, a4, a5, 0); }else if(index == 1){ helper(total, a1, a2+1, a3, a4, a5, 1); }else if(index == 2){ helper(total, a1, a2, a3+1, a4, a5, 2); }else if(index == 3){ helper(total, a1, a2, a3, a4+1, a5, 3); }else{ helper(total, a1, a2, a3, a4, a5+1, 4); } }else{ update(total, a1, a2, a3, a4, a5, index); } } } int main(void){ int n = 100; helper(n, 0, 0, 0, 0, 0, 0); printf("%d\n", count); }
相关文章推荐
- HDUOJ1864最大报销额(01背包)
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
- html中音频和视频
- Android M 6.0 Build about 64-bit (__arm64__)
- SICP 关于递归迭代的重新理解以及尾递归的引入...
- 博客汇总
- 第十一周项目3.1 警察和厨师
- hdoj2036多边形面积的求法
- iOS学习笔记48-Swift(八)反射
- 使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值
- finsh初步
- 关于网站前后端联调得到的
- jQuery实现点击全选和取消全选
- hdoj2602
- 汇编与驱动-采用SSDT Hook NtOpenProcess保护进程
- iOS学习笔记48-Swift(八)反射
- SICP 1.29-1.33
- SVM学习总结
- 重叠社区发现-LFM算法
- POJ3278Catch That Cow(BFS)