第四章 函数和递归
笔记
C语言中的数学函数可以定义成“返回类型 函数名(参数列表){ 函数体 }”,其中函数体的最后一条语句应该是“return 表达式(返回值最好是int、char和double等,如果韩束不需要返回值,则返回类型应写成void)”
算法竞赛中,请return 0;
为了使用方便,往往用“typedfsturch {域定义;}类型名;”的方式定义一个新类型名。酱,就可以像原生数据一样使用这个自定义数据。
*a是指“a指向的变量”,而不仅是“a指向变量所拥有的值”。
{*a=a+1即(a)++;因为++运算符的优先级高于“取内容”预算符“”所以不能写成a++}
把数组作为参数的传递给函数的时,实际上只有数组的首地址作为指针传递给了函数。需要另加一个参数表示元素个数。除了把数组首地址本身作为实参外,还可以利用指针加减法把元素的首地址传递给参数。
{在函数定义中的int a[]等价于int *a;指针a+1指向a[1]即第2个元素(数组元素从0开始编号)
一般地,若p是指针,k是正整数,则p+k就是指针p后面第k个元素,p-k是p前面的第k个元素。而如果p1和p2是类型相同的指针,则p2-p1是从p1到p2的元素个数(不含p2)}
递归:看图很清晰(我觉得)
代码
偷个懒
#include <stdio.h>
#include <string.h>
#define maxn 25
/*
//例题4-3
int n,k,m,a[maxn];
int go(int p,int d,int t)
{
while(t--)
{
do
{
p=(p+d+n-1)%n+1;
}while(a[p]==0);
}
return p;
}
*/
/*
//4-11
int left,chance;
char s[maxn],s2[maxn];
int win,lose;
void guess(char ch)
{
int bad=1;
for(int i=0;i<strlen(s);i++)
if(s[i]==ch)
{
left--;s[i]=' ';bad=0;
}
if(bad)--chance;
if(!chance)lose=1;
if(!left)win=1;
}
*/
/*
//4-10
int f(int n)
{
return n==0?1:f(n-1)*n;
}
*/
/*
//4-6
void swap(int* a,int* b)
{
int t=*a;*a=*b;*b=t;
}
*/
/*
//4-8
int sum(int*a,int n)
{
int ans=0;
for(int i=0;i<n;i++)
ans+=a[i];
return ans;
}
*/
int main()
{
/*
//例题4-3
while(scanf("%d%d%d",&n,&k,&m)==3&&n)
{
for(int i=1;i<=n;i++)
a[i]=i;
int left=n;
int p1=n,p2=1;
while(left)
{
p1=go(p1,1,k);
p2=go(p2,-1,m);
printf("%3d",p1);
left--;
if(p2!=p1)
{
printf("%3d",p2);left--;
}
a[p1]=a[p2]=0;
if(left) printf(",");
}
printf("\n");
}
*/
/*
//4-11
int rnd;
while(scanf("%d%s%s",&rnd,s,s2)==3&&rnd!=-1)
{
printf("Round %d\n",rnd);
win=lose=0;
left=strlen(s);
chance=7;
for(int i=0;i<strlen(s2);i++)
{
guess(s2[i]);
if(win||lose)
break;
}
if(win)
printf("You win.\n");
else if(lose)
printf("You lose.\n");
else
printf("You chickened out.\n");
}
*/
/*
//4-10
printf("%d\n",f(3));
return 0;
/*
/*
//4-8
int a[]={1,2,3,4};
printf("%d\n",sum(a+1,3));
return 0;
*/
/*
//4-6
int a=3,b=4;
swap(&a,&b);
printf("%d %d\n",a,b);
return 0;
*/
}