内容发布更新时间 : 2024/11/16 1:38:34星期一 下面是文章的全部内容请认真阅读。
为,一定是使用了递归算法。
将问题\求1~n的累加和\的公式写成递归定义,可以是如下形式; sum(n)=1 当n=1时 sum(n)=sun(n-1)+n 当n>1时
根据此递归定义,可以很容易完成程序。 【3.27】答案:① return(1) ② n*facto(n-1)
注释:我们熟悉的求n!的算法一般是采用循环语句实现,但在此程序中根本没有循环语句。这时我们应该想到:是采用递归算法实现的。首先写出求n!的递归公式;
n!=1 当n=1时 n!=n*(n-1) 当n>1时
根据此递归定义,可以很容易完成程序。
【3.28】答案:① com=n ② com=combin(n-1,m-1) + combin(n-1,m) 注释:题目的说明中已经给出组合问题的递归定义,不需要读者自己寻找递归表达式。程序中的语句\;\完成了题目中叙述的\用公式(1)进行简化\的工作。
【3.29】答案:① *str=='\\0' ② 1+strlen(str+1)
注释:求串长算法的关键是确定串结束标记'\\0'的位置。根据求串长的方法,可以得到如下递归算法:指针str指向字符串的首字符 如果 当前字符(*str)== 串结束标记'\\0' 则 串长=0
否则 串长 = 1+除第一个字符之外的剩余字符串的串长
因此,在①的位置上应当填写\,以判断当前字符(*str)是否是串结束标记'\\0'。在②的位置应当是根据上面的递归算法进行递归调用,因此应当填写\。
【3.30】答案:① &n ② m ③ m/10 ④ m>0 ⑤ r(m) 【3.31】答案:① prt(c, n-1) ② prt(' ' , n-i) ③ prt('*', i) 注释:函数prt的功能是输出n个字符c。 【3.32】答案:① y(x, n-1)
注释:这显然是一个递归问题,首先要对原来的数学函数定义形式进行变形,推导出原来函数的等价递归定义。可以推导出原来函数的递归定义如下。 y(x,n)=x 当n=0时
y(x,n)=sqrt(x+y(x,n-1)) 当n>0时
【3.33】答案:① p-- ② *p='\\0' ③ *p=c ④ p-- ⑤ *s++
注释:在递归算法中,指针s指向字符串首部要反向的字符,即要将指针s所指向的字符与指针p 所指向的字符串尾的字符('\\0')进行交换,在交换过程中,将尚没有交换的字符串的中间部分作为一个整体,进行递归处理。程序中首先执行\,将首字符存入临时变量;然后执行\,将尾字符存入串首;执行\是递归处理串的中间部分,这时,在②处应当填入\,即存入串结束标记。这是这一程序中的关键所在。在③处要完成将存在临时变量c中的字符存入串尾的工作,应当填写\。 【3.34】答案:① str+1 ② return ①改为 n-2 【3.35】答案:① p>=q ② max=s ③ p,max ④ p+1,q ⑤ &array[0], &array[9]
注释:本程序中的排序部分采用的是递归算法。函数sort的两个形参的含义是:对指针p和指针q之间的数据进行排序。由语句\; s<=q; s++)\中指针p和指针q之间的关系可以得出:指针p不应在指针q之后,因此①处应填\、⑤处应填\。
由于变量max是指向当前最大值的指针,则当找到新的最大值时,max中保存的应该是新的最大值的指针,因此②处应填\。
当调用函数swap交换两个变量值的时候,要求实参是变量的地址,因此,③处应填\将最大值存入指针p所指的单元。
由于问题的要求是\从大到小\排序,通过执行一次函数sort使最大值已经放到了指针p所指的单元中,因此,下一遍排序的时候,只要对指针p之后的元素进行即可,所以④处应填\。 【3.36】答案:① a+1 ② n+'0' 【3.37】答案:① s 注释:p是一个一级指针,赋值后保存二维数组a的首地址,做加法运算加1时,实际地址增加一个它所指向的数据类型的长度。在C语言中,多维数组在计算机中是按行存储的,所以在本题中要通过指针访问二维数组中的数据,必须将二维下标转换为一维下标。 【3.39】答案:① '\\0' 或 0 ② ++ 注释:在C语言中,进行字符串处理时,必须注意串结束标记'\\0',它是在进行串处理时的最基本的要求,所以①中要填入'\\0'。为了使用putchar输出一个字符串,则必须有改变指针的运算,这里只能使用++运算。 【3.40】答案:① p++ ② w[i+1]=w[i] 【3.41】答案:① && ② *a<*b ③ *a++, *b++ ④ == ⑤ != ⑥ '\\0' ⑦ w=s ⑧ n++ ⑨ t=s[i];s[i]=s[j];s[j]=t; ⑩ s3[0] 【3.42】答案:① *++pa ② *++pa ③ *pa ④ return(total) ⑤ n<=2 || n>=MAXNUM+1 ⑥ num+n 【3.43】答案:① stu.name ② &stu.score ③ p->name ④ p->score 注释:这是结构中的最基本概念。 【3.44】答案:① struct student ② strcmp(stu[i].name,str)==0 ③ break 注释:程序的主体是一个二重循环,内层for循环完成查找学生的工作。①处是进行结构数组说明并初始化,按照结构变量说明的格式规定,应该填写:strcut student。②处为if语句的逻辑条件,应当是当查找到指定的学生后输出学生的情况,因此应当填写:strcmp(stu[i].name,str)==0。③处应当将控制退出内层的for循环,只能选择break语句。 【3.45】答案:① p+n ② gets(p->name) ③ p+n 注释:本程序是通过函数完成对于结构数组的输入和输出操作。函数data_in和data_out十分相似,都是通过结构指针p和结构指针q来操作结构数组的元素。由于指针q在两个函数中的作用相同,所以①和③填写的内容也应该