C语言算法学习 递归调用
本帖最后由 wangfakun 于 2011-11-10 13:19 编辑(1)选班委问题:
从n个人中选k个人当班委(不区分职务),一共有多少种选法?
从数学的角度,我们可以直接计算出答案为CnK.
那用C语言怎么描述呢?我们这样做:
先投票第一个人能否当班委:如果能,就从剩余的n-1个人中再选出k-1个;如果不能,就从剩余的n-1个人中再选出k个。以此类推,直到最后一个人。
view plain #include <stdlib.h> #include <stdio.h>
int calculate(int n, int k)
{ if (k > n)
return 0;else if (n == k || k == 0)
return 1;else return calculate(n - 1, k) + calculate(n - 1, k - 1);}
void main()
{ int n = 35;int k = 5;printf("result: %d\n", calculate(n, k));} view plain # # gcc main.c -o main # ./main result: 324632 #(2)汉诺塔问题
汉诺塔是很经典的递归算法,问题我就不再描述了。
view plain #include <stdio.h>
void move(char x, char y);void hanoi(int n, char one, char two, char three);
int main()
{ int m;printf("input the number of diskes:");scanf("%d", &m);printf("The step to move %d diskes:\n", m);hanoi(m, 'A', 'B', 'C');}
void hanoi(int n, char one, char two, char three)
{ if (n == 1)
move(one, three);else { hanoi(n - 1, one, three, two);move(one, three);hanoi(n - 1, two, one, three);}
void move(char x, char y)
{ printf("%c ——> %c\n", x, y);}
学习了
虽然不懂 来学习学习,{:301_997:}
页:
[1]