2010.10.10 第九课 函数(二)(递归)(汉诺塔)

函数(二)--递归

1.函数的调用方式

1.将函数作为表达式调用

int add(int x,int y){
    retuen x+y;
}
int sum =add(100,200)
    printf("sum=%d",sum);

2.将函数作为语句调用

printf()

3.将函数作为实参调用

printf("%d ",max(100,150));

2.递归

条件::1.一定有一个终止条件

2.包含他自己

一些问题

1+2+3+...+100的和
    int sum(int n){
     if(n==1){return 1;}
    else{
    return n+sum(n-1);}
}
!n
    int jiecheng(int n){
     if(n==0){return 1;}
    else {return n*jiecheng(n-1);}
    
}
兔子数列(斐波那契数列)
    1 1 2 3 5 8 13 21
 int tuzi(int n){
    if(n==1||n==2){return 1;}
    else{
        return n+tuzi(n-1);
    }    
}
  
有n个人排成一队,问第n个人多少岁,他回答比前面一个人大2岁,再问前面一个人多少岁,他回答比前面一个人大2岁,一直问到最后问第一个人,他回答10岁
    int age(int n)
{	
    int i;	
    if (n == 1)		
        i = 10;	
    else		
        i = age(n - 1) + 2;	
    return i;
}
汉诺塔
    
    void hnt(int n,char a, char b,char c,){
     if (n==1)
     {printf("%c->%c
",a,c);}
    else{
        hnt(n-1,a,c,b);
       printf("%c->%c
",a,c);
         hnt(n-1,b,a,c);
        }
}

/*hnt(3, a, b, c) {

1..hnt(3 - 1, a, c, b) = {
	hnt(2 - 1,a,b,c) = {a->c}
	a->c = {a->b}
	hnt(2 - 1,c,a,b) = {c->b}
	
	}
2..a->c
3..hnt(3 - 1, b, a, c) = {
	hnt(2 - 1,b,c,a) = {b->a}
	a->c = {b->c}
	hnt(2 - 1,a,b,c) = {a->c}
	}*/


/*
hnt(4, a, b, c) = 
{
1...hnt(4 - 1,a,c,b)  =
    {
		1..hnt(3 - 1,a,b,c) = 
	          {
            1. hnt(2-1,a,c,b)
			2. a->c
	        3. hnt(2-1,b,a,c)
              }
		2..a->b
		3..hnt(3 - 1,c,a,b) =
	         {
		     1.hnt(2-1,c,b,a)
			 2.c->b
	         3.hnt(2-1,a,c,b)
             }
    }
2...a->c
3...hnt(4 - 1,b,a,c) = 
	{
		1..hnt(3 - 1,b,c,a) =
	         {
                1. hnt(2-1,b,a,c)
				2. b->a
	            3. hnt(2-1,c,b,a)
             }
	   2..b->c
	   3..hnt(3 - 1,a,b,c) = 
		    {
				 1.hnt(2 - 1,a,c,b)
				 2.a->c
				 3. hnt(2 - 1,b,a,c)
		    }
    }

}
*/
原文地址:https://www.cnblogs.com/heerha/p/13832846.html