《算法竞赛入门经典》(第二版)第四章笔记

第四章 函数和递归

笔记

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;
*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值