zoukankan      html  css  js  c++  java
  • SICP 换零钱的迭代版本

    看到换零钱方式统计这里, 书中给出了递归的实现但没有给出迭代版本说要留给读者作为挑战, 既然说是作为挑战那肯定是能解决的,在想了一天无果之后最终在别人博客的帮助下终于实现了迭代的版本...也算是经历坎坷...下面是c语言的实现代码,参照的是这位大神的思路,饮水思源这里附上链接: http://www.jianshu.com/p/3e7477ab72de

    C代码如下(匆忙实现没有注释很少,凑合着看) --> 过两天再改成scheme代码,今天懒得弄了...:


     1 #include <stdio.h>
     2 
     3 int count = 0;
     4 int flag = 1; // ---> 主要用来标注是在状态1还是状态2....(原文中的游标是右移动还是左移动)
     5 
     6 int cal(int a1, int a2, int a3, int a4, int a5);
     7 void update(int total, int a1, int a2, int a3, int a4, int a5, int index);
     8 void helper(int total, int a1, int a2, int a3, int a4, int a5, int index);
     9 
    10 
    11 void update(int total, int a1, int a2, int a3, int a4, int a5, int index){
    12   if(flag){
    13     if(index == 0){
    14       helper(total, a1-1, a2+1, a3, a4, a5, 1);
    15     }else if(index == 1){
    16       helper(total, a1, a2-1, a3+1, a4, a5, 2);
    17     }else if(index == 2){
    18       helper(total, a1, a2, a3-1, a4+1, a5, 3);
    19     }else if(index == 3){
    20       helper(total, a1, a2, a3, a4-1, a5+1, 4);
    21     }else{
    22       flag = 0;
    23       count--;
    24       helper(total, a1, a2, a3, a4, a5, 4);
    25     }
    26   }else{
    27     flag = 1;
    28     if(a4 != 0){
    29       helper(total, a1, a2, a3, a4-1, a5+1, 4);
    30     }else if(a3 != 0){
    31       helper(total, a1, a2, a3-1, a4+1, 0, 3);
    32     }else if(a2 != 0){
    33       helper(total, a1, a2-1, a3+1, 0, 0, 2);
    34     }else if(a1 != 0){
    35       helper(total, a1-1, a2+1, 0, 0, 0, 1);
    36     }else{
    37       helper(total, a1, a2, a3, a4, a5+1, 0);
    38     }
    39   }
    40 }
    41 
    42 int cal(int a1, int a2, int a3, int a4, int a5){
    43   return 50 * a1 + 25 * a2 + 10 * a3 + 5 * a4 + a5;
    44 }
    45 
    46 void helper(int total, int a1, int a2, int a3, int a4, int a5, int index){
    47   if(a1 == 0 && a2 == 0 && a3 == 0 && a4 == 0 && cal(a1, a2, a3, a4, a5) > total){
    48     return;
    49   } else{
    50     if(cal(a1, a2, a3, a4, a5) == total){
    51       count++;
    52       update(total, a1, a2, a3, a4, a5, index);
    53     } else if(cal(a1, a2, a3, a4, a5) < total){
    54       if(index == 0){
    55         helper(total, a1+1, a2, a3, a4, a5, 0);
    56       }else if(index == 1){
    57         helper(total, a1, a2+1, a3, a4, a5, 1);
    58       }else if(index == 2){
    59         helper(total, a1, a2, a3+1, a4, a5, 2);
    60       }else if(index == 3){
    61         helper(total, a1, a2, a3, a4+1, a5, 3);
    62       }else{
    63         helper(total, a1, a2, a3, a4, a5+1, 4);
    64       }
    65     }else{
    66       update(total, a1, a2, a3, a4, a5, index);
    67     }
    68   }
    69 }
    70 
    71 
    72 int main(void){
    73   int n = 100;
    74   helper(n, 0, 0, 0, 0, 0, 0);
    75   printf("%d
    ", count);
    76 }




  • 相关阅读:
    EasyUI基础searchbox&amp;progressbar(搜索框,进度条)
    git 仓库
    “农民代码”讨论
    多线程和多进程之间的区别
    move_uploaded_file
    在form里面,放了四个UEditor,怎么在后台分别获取它们值
    ThinkPHP模板IF标签用法详解
    Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗?
    百度UEditor基本使用
    织梦DedeCms获取当前页面URL地址的调用方法
  • 原文地址:https://www.cnblogs.com/nzhl/p/5450379.html
Copyright © 2011-2022 走看看