题目是:读取正整数m和n(假定它们满足m>=n>0),显示所有从集合{1,2,…,m}中取出的n个数的组合。例如,若m=3,n=2,则可以按以下形式之一显示:
3 2
3 1
2 1
#include<stdio.h>
#include<string.h>
int ans[10];
int m, n;
void DFS(int d, int p)
{
int i;
if(d == n)
{
for(i = 0; i < n; i++)
printf("%d ", ans[i]);
printf("\n");
return ;
}
for(i = p+1; i <= m; i++)
{
ans[d] = i;
DFS(d+1, i);
}
}
int main()
{
scanf("%d %d", &m, &n);
DFS(0, 0);
return 0;
}
这个递归实在是看不懂,求解释思路。多加点注解,以及解释一下各个字母以及关键数字的含义好吗?
for(i = p+1; i <= m; i++)
{
ans[d] = i;
DFS(d+1, i);
}
主要就是这里不懂。还有DFS的两个参数是什么意思。
解释下哦:
比如 m = 3, n = 2;
首先调用 DFS(0, 0) 需要第 0 个数,选择范围从 0 + 1 到 m(3),
然后进入 for 循环 i = 0 + 1, 因此第一个数选择1,
继续 调用 DFS(1, 1) 需要第 1 个数,选择范围从 1 + 1 到 m(3),
然后进入新函数的循环 i = 1+1,因此第二个数选择 2 ,
继续 调用 DFS(2, 2) 需要第 2 个数,由于 2 等于n, 表明选择完成,输出 ( 1, 2)
退出函数DFS(2,2) 退回到 DFS(1, 1) 的下一个 for 循环:
循环 i = 2+1,因此第二个数选择 3 ,
继续 调用 DFS(2, 3) 需要第 2 个数,由于 2 等于n, 表明选择完成,输出 ( 1,3)
退出函数DFS(2,3) 退回到 DFS(1, 1) 的下一个 for 循换,循环条件不满足,DFS(1, 1) 执行结束返回到 DFS(0, 0) 继续执行 循环:
i = 1 + 1, 因此第一个数选择2,
继续 调用 DFS(1, 2) 需要第 1 个数,选择范围从 2 + 1 到 m(3),
然后进入新函数的循环 i = 2+1,因此第二个数选择 3 ,
继续 调用 DFS(2, 3) 需要第 2 个数,由于 2 等于n, 表明选择完成,输出 ( 2, 3)
退出函数DFS(2,3) 退回到 DFS(1, 2) 的下一个 for 循环: 循环条件不满足,DFS(1, 1) 执行结束返回到 DFS(0, 0) 继续执行
i = 2 + 1因此第一个数选择3,
继续 调用 DFS(1, 3) 需要第 1 个数,选择范围从 3 + 1 到 m(3), 很明显这里的循环将不能执行,因为循环条件是假的,因此退出 DFS(1, 3) 返回到 DFS(0, 0) 继续执行 循环:循环条件不满足。返回到 主程序 main
执行结束。
求解释一个C语言程序
include <stdio.h>#include <string.h>int ans[10];int m, n;void DFS(int d, int p) \/\/ 需要第d个数,按顺序 从 p + 1 到 m 中选择{ int i; if (d == n) { \/\/ 如果已选出 n 个数,就输出 for (i = 0; i < n; i++) printf("%d ", ans[i]); ...
怎样解释这个c语言程序??特别是划线部分
取位 ,a%10 是取 a 的个位,a\/10%10 是取 a 的十位, a\/100 是取 a 的百位,由于 a 是 int 型,实际范围为 -32768~32767,存在 a 为4位数、5位数 的情况,所以,取百位的正确写法应该是 a\/100%10。如果LZ 硬要说,a已经=123了,不会大于3位数了。那我想说,你还要 a 干嘛,...
大学c语言设计,求解释程序段
C语言提供了一种用于多分支选择的switch语句, 其一般形式为:switch(表达式){ case 常量表达式1: 语句1;case 常量表达式2: 语句2;…case 常量表达式n: 语句n;default: 语句n+1;} 其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, ...
c语言,程序运行结果\/求解释
include <stdio.h>#define M(x, y) x*y \/\/宏替换 将M(x,y) 替换为x*yint s = 0;\/\/全局变量void f1(){int k = 1;s = s + k;\/\/s=s+1 k++;\/\/这句没用 因为k是局部变量 函数执行完毕 这个变量就失效了}void f2(int n){if (n>3)f2(n \/ 4);\/\/如果 n>3 递归调用...
C语言,求解释如下代码的含义,我想知道具体的执行过程。
getchar()函数一次从标准输入读入一个字符,也就是键盘中读入一个字符,但你输入一个字符串的时候,先存在键盘的缓冲区,等到你回车时候,开始从键盘缓冲区读数据,然后保存在 变量c 里面 你的这个函数是自己调用自己,是一个递归程序,所以输出的.noitcnuf siht wonk ot tnaw i ...
谁能帮我分析一下C语言的这个程序
type 可以为任意的C语言中的数据类型。也可以为VOID(即无返回值)。其次,main函数的前面可以为int也可以为void.因为main函数也是函数(废话)。当这个函数执行完毕之后会返回给系统一个值,0表示正确(常)执行。如果你写void的话,编译调试的时候,编译器会自动像系统返回一个值。第三,在写C++程序...
C语言程序语句解释
include <stdio.h> #include是固定格式,意思是”包含“,<stdio.h>中的stdio.h,这是一个库函数头,用<>括起来,这句意思是把名为stdio.h的头(其实是一个文件)包含到当前的程序中。在C语言中,有许多函数可以直接拿来用,比如printf函数(输出函数),这些函数被称为库函数,要想调用这些函数...
解释一段C语言的程序
这是一个考宏定义和运算符优先级的题…将宏函数代入并代入具体的数后k赋值语句就变成:k=10*10<15?10:15;跟据?:语句先算?前的语句又<的优先级低于*所以原语句就变成k=100<15?10:15;得解
C语言程序解释
这是一个三数排序,是通过俩俩比较,然后按照从小到大输出,下面来读一下这个程序:main(){int x,y,z,t;scanf("%d,%d,%d",&x,&y,&z);if(x>y){t=x;x=y;y=t;} \/*如果x>y,就将两者交换;如:当x=4且y=1时,则执行){t=x;x=y;y=t;}语句;执行后的结果是x=1;y=4;*...
一个c语言程序是由什么组成的
C语言源程序是由:数据类型、常量与变量、数组、指针、字符串、文件输入\/输出构成。具体介绍:1、数据类型 C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。2、常量与变量 常量其值不可改变,符号常量名通常用大写。