65,211
社区成员
发帖
与我相关
我的任务
分享
原题如下:
void main()
{
long int n;
void func(); //此句声明有误,从后面的填空就看出来了(void func(____)(2) )既然要填东西,声明又为空矛盾!
cin>>n; //既然输入了n肯定是要用到的
____;(1) //肯定是要调用func函数,至于如调用看下面的解释
}
void func(_____)(2) //暂且不看,暂不做推断
{
if(m>=10)
//此句是解题的关键,又叫递归函数的终止条件,任何递归函数都是有穷的可终止的,否则递归就是个死循环,没有实际的意义,m>=10,m从何而来,函数体没有声明,唯一的解释就是从形式参数传递而来,于是我们又可大胆的推断第一个空、第二个填空分别为n和int m; 再来分析一下为什么把m>=10作为终止条件,根据题意要求(输入任意一整数,在各数位间插入空格后输出),此函数要得到整数的每一位,如何才能得到一个数的每一位呢,对于一个整数,要将其对10求余操作可达到目的,但是对10求余操作只能每次得到整数的最后一位,于是就有了除以10取整的操作.
比如:123, 要得到个位的3,十位的2,百位的1, 在c/c++语言中123/10=12,12/10=1这就是除以10取整的操作,123%10=3、12%10=2、1%10=1这是对10求余操作,楼主现在大概能明白为何要取整又为何要求余,目的很简单就为了得到整数的每一位。
此时,返过头来仔细的考虑条件m>=10,那m什么时候会小于10,小于10又干什么呢?m>=10又干什么呢?显然,为了得到每一位必须对m/10,又必须对m%10,而输出的是每一位带上一个空格,于是我们大胆的推断,(3)空就是m/10 ,(4)空就是m%10
看到没有,通过分析我们离标准的答案越来越近了,窃喜一下!
要彻底解题还是必须有递归函数的基本认知的,这就不得不说递归的定义,说白了就是程序调用自身的编程技巧称为递归!看到我前面举的那个例子了吗,每次都是用再123/10得到数12,123%10得到一个余数3,12/10得到数1,12%10得到余数2,,1%10得到余数1,1/10此时不会再运行了条件m>=10派上用场 (这个m就是表示的123 、12 、1)这就是递归啦,如果楼主还是很模糊,建议多多练习,有了递归的定义和以上的分析(3)空就准确的填上func(m/10);第四空其实就一个地方没有分析(在各数位间插入空格后输出),递归函数返回的是个逆序的输出(本来我们的123按顺序求余、取整操作应该是输出3、2、1,但是通过递归以后,就是一个逆序的序列1、2、3,此时正合我们的意思,于是无需调整直接输出余数加上一个空格),于是(4)空填写m%10<<' ';
____;(3)
cout < <_____;(4)
}
void main()
{
char s1[40],s2[20];
int i,j;
i=j=0;
whlie(s1[i]!='\0')
i++;
while(s2[j]!='\0')
s1[i++]=s2[j++];
s1[i]='\0';(3)
}
void func(int);
void main()
{
long int n;
cin>>n;
func(n);
}
void func(int n)
{
if(n>=10)
fun(n/10);
cout << n%10 << " ";
}