返回信息流getF(int m, int n)
假如m=5 n=3,则要求结果显示如下:
5 4 3
5 4 2
5 4 1
5 3 2
5 3 1
5 2 1
4 3 2
4 3 1
4 2 1
3 2 1
求教求指点 谢谢
这是一条镜像帖。来源:北邮人论坛 / cpp / #48082同步于 2010/12/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
这个函数怎么写
forever216
2010/12/20镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
是说 m是起始数字,n是显示几位的意思么。
每一位一直递减,显示所有组合吧
【 在 forever216 (foreverlove) 的大作中提到: 】
: getF(int m, int n)
: 假如m=5 n=3,则要求结果显示如下:
: 5 4 3
: ...................
主要是要先分析算法
m=5 应该是指初始时 第一个数字为5 ,然后后两个递减 5 4 3
n=3 可能是指3个数,或者是指第一个数最终变化为3
规律是这样的: 末尾的数字3 依次递减 3 2 1
变成1 时候 就是 5 4 1
这应该是个关键点,即末尾为1(倒数第二个为2,倒数第三个为3 。。。倒数第i位为i)
这时候就从最接近它且不满足(倒数i位为i)的那一位减一,后面的所有位加一
比如 5 2 1 ---》 4 3 2
。。。。。
反正即使这样。。
【 在 forever216 (foreverlove) 的大作中提到: 】
: getF(int m, int n)
: 假如m=5 n=3,则要求结果显示如下:
: 5 4 3
: ...................
对 就是这个意思 m是起始数字 n显示几位 显示顺序递减
【 在 GTQ 的大作中提到: 】
: 是说 m是起始数字,n是显示几位的意思么。
: 每一位一直递减,显示所有组合吧
: 【 在 forever216 (foreverlove) 的大作中提到: 】
: ...................
void solve(int *a, int *x, int m, int n, int s, int t) {
if (t > m) return;
if (s == n) {
int i;
for (i=0; i<n; i++)
printf("%d ", x[i]);
printf("\n");
} else {
solve(a, x, m, n, s, t+1);
x[s] = a[t];
solve(a, x, m, n, s+1, t+1);
}
}
#define N 100
void getF(int m, int n) {
int i,a[N],x[N];
for (i=0; i<m; i++) a[i] = m-i;
solve(a, x, m, n, 0, 0);
}
Test:getF(5, 3):
3 2 1
4 2 1
4 3 1
4 3 2
5 2 1
5 3 1
5 3 2
5 4 1
5 4 2
5 4 3
这个结果是倒着输出,要正过来也很容易,这里就不做了
你这里相当于实现的solve呀 主体部分在solve里面了, 怎么在getF里面实现呢 不用像solve函数里面有这么多参数,可以在getF里面定义很多 当然也可以递归 请问咋办呢?
【 在 math 的大作中提到: 】
: void solve(int *a, int *x, int m, int n, int s, int t) {
: if (t > m) return;
: if (s == n) {
: ...................
哦 好的 我明白你的意思了 谢谢啦
【 在 math 的大作中提到: 】
: 当然直接写在getF里面也可以,不过你得单独做初始化,而且每次递归调用时,需要一次判断,代码会显得非常冗余晦涩。
: --
你的solve函数里面 参数s 和 t 各代表什么意思呢?
【 在 math 的大作中提到: 】
: 当然直接写在getF里面也可以,不过你得单独做初始化,而且每次递归调用时,需要一次判断,代码会显得非常冗余晦涩。
: --