函数递归

//
//  main.c
//  函数递归
//
//  Created by zhangxueming on 15/6/2.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

#include <stdio.h>
//n! = n*(n-1)!
//(n-1)!=(n-1)*(n-2)!
//1!=1; 0!=1

//函数递归: 一个函数直接或者的调用它自己, 称这个函数是递归定义的
//递归前进段  递归边界 递归后退段
//递归缺点: 占用内存空间大, 执行效率低

//5!
//func(5)
//5*func(4)
//4*func(3)
//3*func(2)
//2*func(1)

int func(int n)
{
    if (n==1||n==0) {
        return 1;
    }
    return n*func(n-1);
}

//1、斐波那契数列
//1 1 2 3 5 8 13 21 34 55 89 144 ....

int feibonaqi(int n)
{
    if (n==1||n==2) {
        return 1;
    }
    return feibonaqi(n-1)+feibonaqi(n-2);
}

//2、编写递归函数求两个正整数a和b的最大公约数(GCD,Greatest Common Divisor),使用Euclid算法:
//
//如果a除以b能整除,则最大公约数是b。
//
//否则,最大公约数等于b和a%b的最大公约数。
//
//Euclid算法是很容易证明的,请读者自己证明一下为什么这么算就能算出最大公约数。最后,修改你的程序使之适用于所有整数,而不仅仅是正整数。

int euclid(int a, int b)
{
    if (a%b==0) {
        return b;
    }
    return euclid(b,a%b);
}


//3、趣味问题——年龄。有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?用递归算法实现。

int age(int n)
{
    if (n==1) {
        return 10;
    }
    return age(n-1)+2;
}

int main(int argc, const char * argv[]) {
    
    //printf("%d\n", func(5));
    
//    for (int i=1; i<=35; i++) {
//        printf("%d ",feibonaqi(i));
//    }
//    printf("\n");
    
    //printf("最大公约数 = %d\n", euclid(319,377));
    
    printf("age = %d\n", age(5));
    return 0;
}

 

posted @ 2015-06-02 17:52  sirzhang  阅读(338)  评论(0编辑  收藏  举报
AmazingCounters.com