关于递归的优势

前几天做了一个题目

——————————————————————————————————————————————————————————————————————————

作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵
但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢?
这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。

Input输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。
n=0表示输入的结束,不做处理。
Output对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。
Sample Input

3
1 2 3
0

Sample Output

4
————————————————————————————————————————————————————————————————
这个题目我第一眼看完就感觉用if条件语句来做顶多有点麻烦不算难 于是我就开始动手写了最后写了接近二十个if else还没有写完才知道我方法错了
实际上应该用递归写的
 1 #include<stdio.h>
 2 int s = 0;
 3 int mon(int m)
 4 {
 5     if (m >= 100)
 6     {
 7         s += m / 100;
 8         m = m % 100;
 9         mon(m);
10     }
11     else if (m >= 50)
12     {
13         s += m / 50;
14         m = m % 50;
15         mon(m);
16     }
17     else if (m >= 10)
18     {
19         s += m / 10;
20         m = m % 10;
21         mon(m);
22     }
23     else if (m >= 5)
24     {
25         s += m / 5;
26         m = m % 5;
27         mon(m);
28     }
29     else if (m > 2)
30     {
31         s += m / 2;
32         m = m % 2;
33         mon(m);
34     }
35     else if (m >0)
36     {
37         s += 1;
38         return 0;
39     }
40     else if (m ==0)
41         return 0;
42 }
43 int main()
44 {
45     int n, i, j, sum;
46     int *m;
47     while (scanf("%d", &n) != EOF)
48     {
49         if (n == 0)break;
50         sum = 0;
51         m = (int *)malloc(n * sizeof(int));
52         for (i = 0; i<n; i++)
53         {
54             scanf("%d", &m[i]);
55             mon(m[i]);
56             sum += s;
57             s = 0;
58         }
59         printf("%d
", sum);
60     }
61     return 0;
62 }

有时候递归是真的好用 而且有些问题只能用递归解决一定要掌握好





原文地址:https://www.cnblogs.com/miaos/p/miaoz-1-5.html