《C++程序设计语言快速入门》校本课程_第1页
《C++程序设计语言快速入门》校本课程_第2页
《C++程序设计语言快速入门》校本课程_第3页
《C++程序设计语言快速入门》校本课程_第4页
《C++程序设计语言快速入门》校本课程_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++快速入门

以下将引导你快速进入编程的世界。

前言:

学习编程,选何种语言不是关键点,能快速入门并使用它建立自己的

工程并解决问题是本课程考虑的重点。

C++本身的代码简洁性以及传承于c的特性,便利的现成的代码复用

使得其有很多优势,适合课堂教学的同时.,兼顾了工程开发应用,就

选它吧。

第一部分:

1、学习环境的搭建:

为了方便学习,我们在windows系统下写代码,用在线评测系统OJ

评测。本教程使用评测练习。十一中0J的域名目前

为o

首先下载devc++安装,装完然后可以选择Chinesesimple语言,以及

debug编译模式,其他一切默认。

2、第一个程序:1.HelloWorld!

noi题库1.1.01

CtrlN新建文档。

键入以丁代码:〃为注释语句,用于帮助阅读代码含义

#include<iostream>〃包含库文件

#include<cstdio>〃包含库文件,一些基本输入输出的语句定义在此

usingnamespacestd;〃声明命名空间

intmain()〃主函数

(

printf("Hello,World!");〃我们要编写的代码区域

return0;〃表示程序正常运行结束并返回

)

注意标点符号,C++每一个语句以分号结尾”是英文状态下的标点

符号,否则会编译错误。

C++编译生成二进制的可执行exe文件。编译运行(F11),将在屏幕

上输出Hello,World!o

今后我们的主要工作就是编写红色部分内容的代码。

3、C++是函数式语言,利用函数实现各种功能操作

例子2.noi题库1.3.01

:A+B问题

总时间限制:1000ms内存限制:65536kB

描述

在大部分的在线题库中,都会将A+B问题作为第一题,以帮助新手熟悉平台的使

用方法。

A+B问题的题目描述如下:给定两个整数A和B,输出A+B的值。保证A、B

及结果均在整型范围内。

现在请你解决这一问题。

输入

一行,包含两个整数A,B,中间用单个空格隔开。A和B均在整型范围内。

输出

一个整数,即A+B的值。保证结果在整型范围内,

样例输入

12

样例输出

3

^include<iostream>〃包含库文件

ffinclude<cstdio>〃包含库文件,一些基本输入输出的语句定义在此

usingnamespacestd;〃声明命名空间

intmain()〃主函数

(

inta,b;〃定义两个整数型变量

scanf("%d%d",&a,&b);//&取变量的地址,从键盘读入,以空格分隔,分别赋值

给两个变量a和b

printf("%d",a+b);〃偷出a+b的值

return0;〃表示程序正常运行返回

)

4、变量:

变量:可视为在计算机的内存中开辟的一段用于临时存储数据的

容器。

约定:变量使用前要事先声明数据类型。

标识符就是程序员自己起的名字,除了变量名,后面还会讲到函

数名、标号等。不过,名字也不能随便起,C语言规定,标识符只能

由字母(A〜Z,a〜z)、数字(0~9)和下划线(_)组成,并且第一个字符必

须是字母或下划线。

以下标识符是合法的:

a,x,x3,BOOK_1,sum5

以下标识符是非法的:

3s不能以数字开头

S*T出现非法字符*

-3x不能以减号(-)开头

bowy-1出现非法字符减号(-)

另一份a加b的代码:例2.1

#include<iostream>

include<cstdio>〃包含库文件,一些基本输入输出的语句定义在此

usingnamespacestd;〃声明命名空间

intmain()〃主函数

(

inta,b,sum;〃定义两个整数型变量

cin>>a»b;〃8J(Z变量的地址,从键盘读入以空格分隔的数,分别赋值给变量a和b

sum=a+b;//a+b的和复制给变量sum

cout«sum;〃输出sum的值

return0;〃表示程序正常运行返回

)

函数cin和cout功能类似于scanf和printf,为流式输入输出,函数

scanf和printf是格式化输入输出,使用时格式更严格。

注意这里的“二”是赋值语句操作符,不是数学上的等号。

第二部分:顺序,分支,循环语言结构

1、选择结构:

以上为顺序执行的一系列语句。

程序设计一般分为顺序,分支,循环。

以下为分支语句代码例子,以if语句为例

基本语法为:

ifelse语句的结构为:

if(表达式)

语句块1

}

else

语句块2

意思是:如果表达式的值为真,则执行语句块1,否则执行语句块2o

其执行过程可表示为下图:

语句块

1|语句块2

可以只有if而没有else,但要注意if和else的配对关系,最好利用缩

进对齐,养成好的书写代码习惯,提高代码可读性,便于以后自己阅

读调试,也利于在大型工程中便于协同合作。

可以嵌套:语句块1和语句块2中,可以包含if语句或者其他,称为

嵌套。

例如:L4.03奇偶数判断

总时间限制:1000ms

内存限制:65536kB

描述

给定一个整数,判断该数是奇数还是偶数。

输入

输入仅一行,一个大于零的正整数n。

输出

输出仅一行,如果n是奇数,输出odd;如果n是偶数,输出even。

样例输入

5

样例输出

odd

来源

北京大学计嵬概论06

参考源代码

#include<cstdio>

#include<iostream>

usingnamespacestd;

innmain()(

intn;

cin>>n;

if(n%2==l)cout<<noddn;

elsecout<<"even";

return0;

例如:期末考试成绩出来了,我们把它分下类:90~100为“Great”;

70〜89为“Good";60~69为“Average";0〜59位“Poor”。

#include<cstdio>

usingnamespacestd;

intmain()

{inta;

scanf("%d",&a);

if(90<=a&&a<=100)

(

printf("Great");

)

else

(

if(70<=a&&a<=89)

(

printf("Good");

)

else

(

if(60<=a&&a<=69)

(

printf("Average");

}

else

(

if(0<=a&&a<=59)

(

printff'Poor");

)

)

)

)

return0;

}

注意逻辑表达式常常会用到&&表示且,||表示或,!表示取反。担心

运算优先级引起混乱的,可以用小括弧。

练习:十一中0J上的第7题,if语言题目。

对于switch语句,请自行阅读了解。

另外一种多分支选择的语句一一switch语句,它的基本语法格式如

下:

switch(表达式){

case常量表达式1:

语句块1;

break;

case常量表达式2:

语句块2;

break;

case常量表达式n:

语句块n;

break;

default:

语句块n+1;

它的执行过程是:首先计算“表达式”的值,然后从第一个case开

始,与“常量表达式x”进行比较,如果与当前常量表达式的值不相

等,那么就不执行冒号后边的语句块,一旦发现和某个常量表达式的

值相等了,那么它会执行之后所有的语块。注意每个语句块后面要加

上break,否则会不判断接下来是否相等一直执行下去。如果直到最

后一个“常量表达式n”都没有找到相等的值,那么就执行default后

的“语句n+r\

一个更加简洁的分支选择方法,叫做条件运算符,语法格式为:

表达式1?表达式2:表达式3

条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果

表达式1的值为真,则以表达式2的值作为整个条件表达式的值,

否则以表达式3的值作为整个条件表达式的值。条件表达式通常用于

赋值语句之中。

例如求最值:

if(a>b)mymax=a;

elsemymax=b;

上面的ifelse语句等价于:

mymax-(a>b)?a:b;

该语句的语义是:如a>b为真,则把a赋予mymax,否则把b赋予

mymaxo

你可以认为条件运算符是一种简写的ifelse,你完全可以用ifelse

代替条件运算符。

2、循环结构:

例如,输出1到100的所有整数之和。

语法:while(逻辑表达式)

循环体语句块

)

注意循环条件,耍能够正常结束循环,一般在循环体中不断更新循环

条件,最终循环条件不满足,跳出循环,否则死循环将导致程序不能

正常结束。同时循环体内也可以有新的循环语句,构成循环的嵌套。

例3.1

#include<cstdio>

#include<iostream>

usingnamespacestd;

intmain()

(

inta=l,s=O;〃变量要初始化,否则可能是个随机的值

while(a<=100)〃循环条件

(

s=s+a;〃每循环一次,累加到变量s

a++;//a=a+l的简写

printf("%d\n",s);〃输出s变量的值并换行

)

return0;

)

延伸:偶数和?

3、程序的调试,debug

点击行号可以为程序添加断点,使程序运行到某一步停下来,等待我

们手动执行下一步,此时可以查看某些变量实时的值,或者在程序中

添加中间变量输出,以判断程序执行中是否按我们的意愿执行。

作业:完成十一中0J上的8号题目。

参考代码:

#include<cstdio>

intmain()

(

intn,a,sum=O;

scanf("%d",&n);

inti=l;

while(i<=n)

(

scanf("%d",&a);

sum=sum+a;

i++;

)

printf("%d",sum);

re:urn0;

十一中0J上的13号题目

伊J:假设一个三位数x的百位、十位、个位上的数字分别为a、b、c,如果

a人3+b3+c人3恰好等于x,则称x为水仙花数,如:153就是一个水仙花数,

1八3+5八3+3A3=1+125+27=153。请编写程序判断一个三位正整数是否是水仙

花数。

用到取余运算符%

参考代码:

#include<iostr€am>

#include<cstdio>

usingnamespacestd;

intmain()

(

intnumber,gewei,shiwei,baiwei;

seanf("%d"^number);

gewei=number%10;

shiwei=number/10%10;

baiwei=number/100;

if

(gewei*gewei*gewei+shiwei*shiwei*shiwei+baiwei*baiwei*baiw

ei==number)

(

printf:"TRUE");

)

else

(

printf;"FALSE");

)

return0;

)

我国古代算术问题,百钱百鸡问题:

#include<iostream>

#include<cstdio>

usingnamespacestd;

intmain()

(

inta,b,c;

a=l;

while(a<=100)

(

b=l;

while(b<=100)

(

c=3;

while(c<=99)

(

if((5*a+3*b+c/3==100)&&(a+b+c==100))

(

printf("公鸡=%匕母鸡=%d,小鸡=%d\n”,a,b,c);

)

c=c+3;

)

b++;

)

a++;

}

return0;

)

综合练习:计算1到100能被3整除或者能被5整除的所有数之和。

#include<cstdio>

#include<iostream>

usingnamespacestd;

intmain()

(

inta=l,s=0;

while(a<=100)

(

if(a%3==0||a%5==0)

s+=a;

a++;

)

printf("%d\n",s);

return0;

)

逻辑运算符||&&

scant()语句和printf()语句是标准格式化输入输出语句

参考

scanf和printf这两个函数分别称为格式输入函数和格式输出函数。其意义是按指定的格式输

入愉出值。因此,这两个函数在括号中的参数都由以下两部分组成:

1)格式控制审:格式控制串是一个字符串,必须用双引号括起来,它表示了输入输出量的数

据类型。

在printf函数中可以在格式控制串内出现非格式控制字符,这时在显示屏幕上会显示源字符

串。各种类型的格式表示方式请参考:C语言格式输出函数printf。详解C语言格式输出函

数prirtfO详解

在scanf函数中也可以在格式控制串内出现非格式控制符,这时会将输入的数据以该字符为

分隔。各种类型的格式表示方式请参考:C语言scanf()函数。C语言scanf()函数。

2)参数表:参数表中给出了输入或输出的变量。当有多个变量时,用英文逗号(,)分开。例如:

printf("sineof%lfis%lf\n",xzs);

〃%lf为格式字符,表示按双精度浮点数处理,它在格式串中两次现,对应了x和s两个变量

//其余字符为非格式字符则照原样输出在屏幕上。

scanf("%d%fa%c",&intNum,&floatNum,&c);

〃%d,%f,%c为格式字符

//表示将输入的数据分别以整数、浮点数和字符形式赋值给变量intNum,floatNum,c

//其中的空格和a为分隔符

〃变量intNum,floatNum,c都有一个'&'符号,表示取地址

例如计算两个实数的和a+b,cin和cout更简洁一些

ffinclude<iostream>#include<iostream>

#include<cstdio>#include<cstdio>

usingnamespacestd.usingnamespacestd;

intmain()intmain()

{floata,b;{floata,b;

scanf("%f%f",&c,&b);cin»a»b;

printf("%f\n",a+b);cout«a+b«endl;

return0;return0;

)

4、for循环结构

格式:for(语句1;逻辑表达式2;语句3)

语句块:循环体

先执行语句1,然后逻辑表达式2,分两种情况:如为真(非0),则

执行循环体,然后执行语句3;如为假,则不执行循环体,结束循环。

注意:表达式1仅在第一次循环时求解,以后都不会再执行,可以认

为这是一个初始化语句。

1)for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”

和“表达式3(循环变量增量)”都是选择项,即可以缺省,但分号(;)

不能缺省。

2)省略了“表达式1(循环变量赋初值)”,表示不对循环控制变量赋

初值。

3)省略了“表达式2(循环条件)”,如果不做其它处理就会成为死循环。

for循环的执行过程可用下图表示:

高斯求和问题循环代码对比:

#include<cstdio>#include<cstdio>

#include<iostream>#include<iostream>

usingnamespacestd;usingnamespacestd;

intmain()intmain()

((

inta=l,s=0;inti,s~O;

while(a<=100)for(i=l;i<=100;i++)

((

s+=a;//s=s+as+=i;

a++;

)

)cout«s;

printf("%d\n",s);return0;

return0;

)

)

练习使用for语句改写百钱百鸡问题求解。

样例代码:

^include<iostream>

ffinclude<cstdio>

usingnamespacestd;

intmain(){

for(inta=l;a<=20;a++){

fur(inlb=l;b<=33;b++){

for(intc=3;c<=99;c=c+3){

if((5*a+3*b+c/3==100)&&(a+b+c==10C))

(

cout«a«""«b«""«c«endl;

)

return0;

)

请自行学习和验证break和continue语句。

break语句

break可以用来跳出switch语句。当break语句用于while、for循环

语句中时,会终止循环而执行循环语句后面的代码。break语句通常

和if语句一起使用,却满足条件时便跳出循环。

continue语句

continue语句的作用是跳过循环体中剩余的语句而强行执行下一次

循环。continue语句只用在while、for循环中,常与if条件语句一

起使用,判断条件是否成立。

第三部分数组和指针

数组问题:

观察以下代码:并运行之。

#include<cstdio>

/include<iostream>

usingnamespacestd;

inta[110];

intmain()

(

inti,s=O;

for(i=l;i<=100;i++)

(

a[i]=i;

)

for(i=l;i<=100;i++)

(

s=s+a(i);

)

cout«s;

return0;

)

该代码表示开一个大小为110的数组(相当于110个变量),分别给

a[l]=l;a[2]=2;a[3]=3;……a[100]=100燃后将这100各变量的值累加。

定义数组就是定义一批变量,然后通过下标序号方便地引用变量。数

组可以是多维的,如3维数组arr[1000][1000][1000],其包含的变量数

为le9.

注意定义数组要放在主函数之外,以免内存不足,特别注意的是,数

组内第一个元素是而不是同理也要注意最后一个元素

arr[O],arr[l]o

的编号。

完成H^一中上的习题15,数组练习。

有n个整数,分别为a(l),a(2),a(3)...a(n)o

现在询问你m次,第i次洵问一个整数q(i),问你a(q(i))是什么?

参考代码:

#include<cstdio>

#include<iostream>

usingnamespacestd;

constintkN=le5+10;

intarr[kN];

intmaini)

(

intn,m;

cin»n»m;

for(inti=1;i<=n;i++)

(

cin»arr[i];

)

for(inti=1;i<=m;i++)

(

intx;

cin»x;

cout«arr[x]«endl;

)

return0;

)

数组名为该数组的首地址。数组名字退化为指针,所以数组名arr实

际指的是数组的第一个元素的地址,初学者建议使用&arr[number]访

问数组的地址。

变量的内存地址:系统分配内的变量编号。类似于学籍号或者身份证

号,变量名是我们给变量起的昵称,便于我们人脑的阅读和识别。

第四部分:文件输入输出重定向:以十一中第8题为例:

freopen函数,源程序*.cpp和读入数据文件*.in放在同一层目录下,

否则需加路径。将样例数据写入data.in,运行程序后,将会把结果输

出到文件result.out

主要用于本地测试。在调试环境中运行程序,输入测试数据,当能得

到正确运行结果后,才将程序提交到oj中

#include<cstdio>

intmain()

(

freopenf'data.in'V'r'^stdin);

freopen("result.out","w",stdout);

intn,b,sum=O;

scanf("%d",&b);

inti=l;

while(i<=b)

{scanf("%d",&n];

sum+=n;

i++;

)

printf("%d",sum);

fclose(stdin);

fclose(stdout);

return0;

)

在使用完一个文件后应该关闭它,这应该成为一个习惯。如果不关闭

文件,可能会丢失数据。因为在向文件写数据时,实现将数据输到缓

冲区,待缓冲区充满后才正式输出给文件,如果当数据未充满缓冲区

而程序结束运行,就会将缓冲区中的数据丢失。用fclose函数关闭义

件,他先将缓冲区中的数据输出到磁盘文件然后才释放文件指针变

量,从而避免了数据丢失。

第五部分:0记号

排序:一排n个正整数,要求由小到大排序。

1、冒泡算法

经典排序算法・冒泡排序Bubblesort

原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,

这样一趟过去后,最大或最小的数字被交换到了最后一位,

然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子

例子为从小到大排序,

原始待排序数组[612141115191

第一趟排序(外循环)

第一次两两比较6>2交换(内循环)

交换前状态I61214|1|5|9|

交换后状态I21614|1|5|9|

第二次两两比较,6>4交换

交换前状态|2I6I4I1|5|9|

交换后状态I2I4I6I1|5|9|

第三次两两比较,6>1交换

交换前状态I2|416111519|

交换后状态|2|411161519|

第四次两两比较,6>5交换

交换前状态I2|4|1I6I5I9|

交换后状态I2|4|1I5I6I9|

第五次两两比较,6<9不交换

交换前状态I2|4|1|5I6I9I

交换后状态I2|4|1|5I6I9I

第二趟排序(外循环)

第一次两两比较2v4不交换

交换前状态I21411|5|6|9

交换后状态I21411|5|6|9

第二次两两比较,4>1交换

交换前状态|2I4I1I5|6|9

交换后状态|2I1I4I5|G|9

第三次两两比较,4<5不交换

交换前状态|2|114151619

交换后状态|2|1I4I5I6|9

第四次两两比较,5<6不交换

交换前状态|2|1|4I5I6I9

交换后状态|2|1|4|5I6I9

第三趟排序(外循环)

第一次两两比较2>1交换

交换后状态I21114|5|6|9

交换后状态I11214|5|6|9

第二次两两比较,2<4不交换

交换后状态|1I2I4I5|6|9

交换后状态I1121415|6|9

第三次两两比较,4<5不交换

交换后状态|1|2I4I5I6|9

交换后状态|1|2I4I5I6|9

第四趟排序(外循环)无交换

第五趟排序(外循环)无交换

排序完毕,输出最终结果124569

复杂度分析:

n+n2+n

#include<cstdio>

#include<iostream>

usingnamespacestd;

intmain()

(

intarray(10]={15,225,34,42,52,6,7856,865,

954,10);

inti,j;

for(i=0;i<10;i++)

(

〃每一次由底至上地上升

for(j=0;j<9-i;j++)

(

if(arrayO+l]<array[j]l〃大数往后移

(

inttemp;

temp=array[j+l];

array[j+l)=array[j];

array[j]=temp;

)

)

)

for(i=0;i<10;i++)

(

printf("%d\n",array[i]);

)

return0;

//解法一:口泡排序

//空间复杂度:0(n),时间复杂度:0(M2)

//预计得分:70

ttinclude<cstdio>

usingnamespaces:d;

constintkN=le5+10;

intarr[kN],N;

intmain()

(

scanfC%d",&N);

for(inti=1;i<=N;i++)

(

scanfC^d",&arr[i]);

)

for(inti=1;i<=N;i++)

{

for(intj=N;j>i;j--)

(

if(arr[j]<arr[j-l])〃小数往前移

(

intt=arr[j];

arr[j]=arr[j-l];

arr[j-l]=t;

)

)

}

for(inti=1;i<=N;i++)

(

printf("%d",arr[i]);

)

return0;

)

Debug两份代码,查看数组元素中的值是如何交换的。

2、桶排序。

桶排序顾名思义是把数据按照大小//解法二:桶排序

//空间复杂度:0(m),时间复杂

分块,每一块的放到一个桶里,第二度:O(n+m)m为需要排序的数字

的最大值

个桶的所有数大于第一个桶的所有//预计等分:100

#include<cstdio>

数,第三个桶的所有数大于第二个桶usingnamespacestd;

constintkM=5e5+10;

所有的数……这一步的实现有多种方intcnt[kM],N;

intmain{)

法,如果要在0(n)内一般要用类似于(

scanf("%d",&N);

建立哈希表的方法(但并不完全相for;inti=1;i<=N;i++)

(

同,桶排序要求桶之间是有大小顺序intx;

scanf("%d",&x);

的)。然后每个桶里的数据然后再进cnt(x]+=1;

}

行排序,排序方法任选,当然也可以

for;inti=0;i<kM;i++)

再用桶排序(例如先以最高位为键值{

for(intj=0;j<cnt(i];j++)

进行桶排序,再以次高位为键值进行(

printf("%d",i);

桶排序,直到个位)。}

}

return0;

)

字符:chardata

字符数组:chararr[UO]

字符串:strings

数据类型为字符型的变量,在内存中和int型变量的存储是一样的。

数组名是字符数组的首地址,和数组首元素的地址相等。

例如chara

scanf("%c,&a);〃表示由控制台读入一个字符

字符在计算机中是以二进制存储的,

ASCII码规定了128个英文字符与二进制的对应关系,占用一个字节(实际上只占用了一个

字节的后面7位,最前面1位统一规定为0\例如,字母a的的ASCU码为01100001,

那么你暂时可以理解为字母a存储到内存之前会被转换为01100001,读取时遇

到01100001也会转换为a0

请尝试编程输出表中的字符。

延伸知识:ASCII码和Unicode码

include<cstdio>

#include<iostream>

usingnamespacestd;

intmain()

(

for(inti=0;i<128;i++)

(

printf("%c\n",char(i));

)

return0;

第六部分:自定义函数

函数

Max函数的实现#include<cstdio>

#include<iostream>

usingnamespacestd;

intmax(intm,intn){

if(m>n)

returnm;

else

returnn;

)

intmain(){

inta,b,ans;

printf("lnputtwonumber:");

scanf("%d%d",&a,&b);

ans=max(a,b);

printf("Thebigeris%d\n",ans);

return0;

也可用三元运算符返回,比如max=(m>n)?m:n;

例:将组成单词的字母反序输出:

"include<cstdio>

^include<iostream>

usingnamespacestd;

chars[100];

intmain(){

intlen=O;

while(cin»s[len])

len++;

for(inti=len-l;i>=O;i-)

cout«s[i];

return0;

不例:计算l+2+3+...+(n-l)+n的值。

#include<cstdio>

#include<iostream>

usingnamespacestd;

intsum(intn){

inti;

for(i=n-l;i>=l;i-)

(

n+=i;

)

prin:f("Theinnern=%d\n",n);

returnn;

)

intmain(|{

int「,total;

scanf("%d",&n);

total=sum(n);

prin^("l+2+3+...+(n-l)+n=%d\n",total);

return0,

}

阶乘函数

一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。

执行递归函数将反复调用其自身,每调用一次就进入新的一层。

【示例】用递归计算出。阶夷n!的计算公式如下:

,(1(H=0.1]

n,[n*(n-1)!(n>1)

根据公式编程:

/include<cstdio>

#include<iostream>

usingnamespacestd;

longlongfac(intn)

(

longlongf;

if(n==l)

f=l;

else

f=n*fac(n-l);

returnf;

)

intmain()

(

inta,

longlongresult;

cin»a;

for(inti=l;i<=a;i++)

(

result=fac(i);

cout«result«endl;

}

return0;

}

第七部分:递归

一般来说,递归需要有边界条件、递归前进段和递归返回段。当

边界条件不满足时,递归前进;当边界条件满足时,递归返回。

注意:递归就是调用自身,在使用递归策略时,必须有一个

明确的递归结束条件,称为递归出口。

递归算法一般用于解决三类问题:

(1)数据的定义是按递归定义的。(Fibonacci函数)

⑵问题解法按递归算法实现。(回溯)

⑶数据的结构形式是按递归定义的。(树的遍历,图的搜索)

*递归的缺点:

递归算法解题的运行效率较低。在递归调用的过程当中系统为

每一层的返回点、局部量等开辟了栈来存储。递归次数过多容

易造成栈溢出等。

练习:的第20题。

阶乘,一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的枳,并且有

。的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿•卡曼引进这个表示法。

任何大于1的自然数n阶乘表示方法:

n!=lx2x3x---(n-l)n

参考代码:#include<cstdio>

#include<iostream>

usingnamespacestd;

longlongfactfintn){

longlongf=l;

for(inti=l;i<=n;i++)

(

f=fi;

)

returnf;

)

intmain(){

inta;

cin»a;

cout«fact(a)«endl;

return0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论