求解释一个C语言程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求解释一个C语言程序相关的知识,希望对你有一定的参考价值。

题目是:读取正整数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的两个参数是什么意思。

#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]);
        printf("\\n");
        return;
    
    for (i = p + 1; i <= m; i++) 
        ans[d] = i; // 选择 第 d 个数为 p +1 到 m , 假设选择了 x 
        DFS(d + 1, i); // 继续选择 第 d + 1 个数, 则选择范围是 x + 1 到 m
    

int main()

    scanf("%d %d", &m, &n);  // 输入两个数 m, n
    DFS(0, 0); // 第一个是 选出个数, 
    return 0;

解释下哦:

比如 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

执行结束。

参考技术A escsew_'_beppeps:# 参考技术B 第一个
main()

inta=1,b=4,c=2;
//给整数a,b,c赋值
float
x=10.5,y=2.0,z;
//给小数x,y赋值,申明小数z
z=(a+b)/c+sqrt((double)y)*1.2/c+x;
//计算z的算式:sqrt表示开根号,要加#include(stdio.h)才能用,(double)表示把y强制类型转换成double型,*表示乘法,/表示除法
printf(“%f\n".z);//输出浮点数z

第二个
m=(k+=i*=k);
赋值语句结合顺序是从右往左结合:最右边i*=k
是i=i*k的简写,计算结果i=2*2=4;同理,k+=i是k=k+i;计算结果k=2+4=6最后m=k;所以m=6;

写单片机中断中(C语言) interrupt 1 using 0 1 ,0 是啥用的?求解释。

interrupt 后面的点是中断号。重点我给你解释下using。

这是C51编译器扩展的关键字。用来选择80c51单片机中不同的寄存器组,你也知道R0-R7总共有4组,那么using 后面的数字也就是0-3范围里的一个数了。如果不需要using的话,编译器会自动选择一组寄存器作为绝对寄存器访问的。
using对代码是有一定的影响的。
给你说个简单的例子,你可以想下,
如果定义
void time0() interrupt 1 using 1
假设,我们又在中断里调用了一个delay();这个delay是起延时作用。
那么,我们就需要确保我们使用的寄存器组是同一组,否则,就会出现混乱。追问

感谢你的回答。还想问下怎么看代码是在哪个寄存器组里的?

参考技术A 51单片机内的寄存器是R0--R7(共有四组即32个字节)
R0-R7在数据存储器里的实际地址是由特殊功能寄存器PSW里的RS1、RS0位决定的。

using 0时设置 RS1=0,RS0 =0,用第0组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(00H)....R7(07H)

using 1时设置 RS1=0,RS0 =1,用第1组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(08H)....R7(0FH)

using 2时设置 RS1=1,RS0 =0,用第2组寄存器,R0--R7的在数据存储区里的实际地址是08H-0FH。R0(10H)....R7(17H)

using 3时设置 RS1=1,RS0 =1,用第3组寄存器,R0--R7的在数据存储区里的实际地址是00H-07H。R0(18H)....R7(1FH)

以上是关于求解释一个C语言程序的主要内容,如果未能解决你的问题,请参考以下文章

C语言问题,求解释(关于动态链表和文件写入):

C语言,输入一行文字,单词间以空格分隔,然后分离其中的单词按每行一个单词输出,程序有了,求解释

C语言实验题,这是输入十六进制数字反序输出的程序,每一步求解释,看不懂程序.

菜鸟再次求救!C语言3个数小到大排,为何3个if就行?if里面的赋值为啥要这样,求解释,谢了

(c语言题目没看懂什么意思,求解释)编一个程序,统计从键盘输入的命令行中,第二个参数所包含的英文字符

我用的是dev c++4.9.9.2 下面是C的程序代码 printf函数输出不了,求解释。。 菜鸟勿喷。。