函数调用,递归和栈的大小

#define _CRT_SECURE_NO_WARNINGS//必须放在第一行
#include <stdio.h>
#include <math.h>
/*
* 递归:直接或者间接调用自己
* 函数调用需要用到栈
* 栈的大小:1M
* 局部变量:定义在函数内部的变量,包括形参.局部变量分配在栈中
*/
int Age1(int n)
{
    int tmp = 10;
    for (int i = 1; i < n; i++)
    {
        tmp += 2;
    }
    return tmp;
}

//Age(5):第5个人的年龄
//Age(4):第4个人的年龄
//Age(3):第3个人的年龄
//Age(2):第2个人的年龄
//Age(1):第1个人的年龄
//Age(n):第n个人的年龄
//Age(n-1):第n-1个人的年龄
int Age(int n)//求年龄
{
    int tmp; //年龄
    if (n == 1)
        tmp = 10;
    else
        tmp = Age(n-1) + 2;
    return tmp;

    //return n == 1 ? 10 : Age(n - 1) + 2;//等同上面的代码
}

//用递归求阶乘
long long Fac(int n)
{
    if (n == 0 || n == 1)
        return 1;
    return n * Fac(n - 1);
}

//利用递归求1+2+3+...+n
int Sum(int n)
{
    if (n == 0 || n == 1)
        return n;
    return Sum(n - 1) + n;
}

long long Fibon1(int n)
{
    long long f1 = 1;
    long long f2 = 1;
    long long f3 = 1;
    for (int i = 2; i < n; i++)
    {
        f3 = f1 + f2;
        f1 = f2;
        f2 = f3;
    }
    return f3;
}

//递归实现斐波那契数列
//斐波那契数列是最不适合使用递归的例子(太慢)
long long Fibon(int n)
{
    if (n == 1 || n == 2)
        return 1;
    return Fibon(n - 1) + Fibon(n - 2);
}

int main()
{
    printf("%lld\n", Fibon(50));
    //for (int i = 1; i <= 10; i++)
    //    printf("%lld,",Fibon1(i));

    /*printf("%d\n",Sum(10));
    printf("%d\n", Sum(100));
    printf("%d\n", Sum(1000));*/
    /*for (int i = 0; i < 10; i++)
        printf("%d!=%lld\n",i,Fac(i));*/
    /*for (int i = 1; i <= 5; i++)
        printf("%d\n",Age(i));*/

    //printf("%d\n", Age1(5000));//可以
    //printf("%d\n",Age(5000));//崩溃,栈溢出,递归次数太多,超过栈容量

    return 0;
}

//测试栈的大小
//int main()
//{
//    //char arr[1024];//1k ,可以
//    //char arr[1024 * 1024];//1M,程序崩溃
//    char arr[1024 * 1000];// 接近1M,可以
//    printf("好了\n");
//
//    return 0;
//}
//1.利用函数, 实现判断一个数字是否为素数, 并测试7, 9, 10, 91
//bool IsPrimer(int n)
//{
//    for (int i = 2; i <= sqrt(n); i++)
//    {
//        if (n % i == 0)
//            return false;
//    }
//    return true;
//}
//int main()
//{
//    for (int i = 2; i < 100; i++)//测试用例
//    {
//        if (IsPrimer(i))
//            printf("%d\n",i);
//    }
//    return 0;
//}

//2.利用函数实现求斐波那契数列数列的第n项,并测试前10项
//long long Fibon(int n)
//{
//    long long f1 = 1;
//    long long f2 = 1;
//    long long f3 = 1;
//    for (int i = 2; i < n; i++)
//    {
//        f3 = f1 + f2;
//        f1 = f2;
//        f2 = f3;
//    }
//    return f3;
//}
//
//int main()
//{
//    for (int i = 1; i <= 20; i++)//测试
//    {
//        printf("%lld,",Fibon(i));
//    }
//    return 0;
//}

//3.利用函数实现折半查找,如果找到数据返回该数据的下标,失败返回-1.函数设计如下:
//int BinSearch(int arr[], int len, int key)//arr为数组名,len为数组长度,key为需要查找的数据
//{
//    int low = 0;
//    int high = len - 1;
//    int mid;
//    while (low <= high)
//    {
//        mid = (low + high) / 2;
//        if (arr[mid] == key)
//            return mid;
//        else if (arr[mid] < key)//在后面找
//            low = mid + 1;
//        else
//            high = mid - 1;
//    }
//    return -1;
//}
//
//int main()
//{
//    int arr[] = {1,3,5,6,7,8,9,12,34,56,78,99,100};
//    int index;
//    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
//    {
//        index = BinSearch(arr, sizeof(arr) / sizeof(arr[0]), arr[i]);
//        if (index >= 0)
//            printf("%d找到了,在%d下标\n", arr[i], index);
//        else
//            printf("%d没有找到\n",arr[i]);
//    }
//    int n = 0;
//    index = BinSearch(arr, sizeof(arr) / sizeof(arr[0]), n);
//    if (index >= 0)
//        printf("%d找到了,在%d下标\n", n, index);
//    else
//        printf("%d没有找到\n", n);
//    n = 10;
//    index = BinSearch(arr, sizeof(arr) / sizeof(arr[0]), n);
//    if (index >= 0)
//        printf("%d找到了,在%d下标\n", n, index);
//    else
//        printf("%d没有找到\n", n);
//
//    n = 110;
//    index = BinSearch(arr, sizeof(arr) / sizeof(arr[0]), n);
//    if (index >= 0)
//        printf("%d找到了,在%d下标\n", n, index);
//    else
//        printf("%d没有找到\n", n);
//
//    return 0;
//}

//4.利用函数实现字符串拷贝(不能使用库函数).
//void Mystrcpy(char des[], char src[])//des=src
//{
//    int i;
//    for (i = 0; src[i] != '\0'; i++)
//    {
//        des[i] = src[i];
//    }
//    des[i] = '\0';
//}
//
//int main()
//{
//    char str1[100];
//    char str2[] = "hello world";
//    Mystrcpy(str1,str2);
//    printf("%s\n",str1);
//
//    return 0;
//}

//5.利用函数实现字符串比较(不能使用库函数).
//int Mystrcmp(const char str1[], const char str2[])
//{
//    int i;
//    for (i = 0; str1[i] != '\0' && str2[i] != '\0'; i++)
//    {
//        if (str1[i] > str2[i])
//            return 1;
//        else if (str1[i] < str2[i])
//            return -1;
//    }
//    return str1[i] - str2[i];
//}
//
//int main()
//{
//    printf("%d\n",Mystrcmp("abc","xy"));
//    printf("%d\n", Mystrcmp("abc", "abc"));
//    printf("%d\n", Mystrcmp("abc", "ab"));
//
//    return 0;
//}

#define _CRT_SECURE_NO_WARNINGS//必须放在第一行
#include <stdio.h>
#include <math.h>
#include <time.h>

/*
* Debug:程序员使用的版本.包含调试信息,程序没有优化,生成可执行程序比较大
* Release:普通用户使用的版本,没有调试信息,程序有优化(编译器自行优化),生成的可执行程序比较小
*算法效率分析:
*   时间复杂度:
*   空间复杂度:

*/
int main()
{
    return 0;
}


#if 0
//1.利用递归实现猴子吃桃。 猴子第一天摘若干桃子,
//当即吃了一半,不过瘾又吃了一个。 第 2 天早上又将剩下的
//桃子吃掉一半,又多吃了一个。 以后每天早上都吃前一天剩下
//的一半零一个。 到第 10 天早上想吃时,就只剩一个桃子了。
//求第一天摘的桃子数
int Peach(int n)
{
    if (n == 10)
        return 1;
    return (Peach(n + 1) + 1) * 2;
}

/*
* 2.利用递归将一个整数 n 顺序输出每一位,中间用空格隔开。
例如输入 483,输出 4 8 3,n 的位数不确定。
*/
//Show(483):4 8 3
//Show(48):4 8
void Show(int n)//顺序输出n的每一位
{
    if (n >= 10)
        Show(n/10);
    printf("%d ",n%10);
}

long long Fibon1(int n)
{
    long long f1 = 1;
    long long f2 = 1;
    long long f3 = 1;
    for (int i = 2; i < n; i++)
    {
        f3 = f1 + f2;
        f1 = f2;
        f2 = f3;
    }
    return f3;
}

//斐波那契数列是最不适合使用递归的例子(太慢)
long long Fibon(int n)
{
    if (n == 1 || n == 2)
        return 1;
    return Fibon(n - 1) + Fibon(n - 2);
}

int g_count = 0;//统计汉诺塔一共移动的次数
//将盘子从x移到y
void Move(char x, char y)
{
    printf("%c->%c\n",x,y);
    g_count++;
}

//汉诺塔,将n个盘子,从a,通过b,移到c
void Hanio(int n, char a, char b, char c)
{
    if (n == 1) //只有最后一个盘子,直接从a移到c
        Move(a,c);//printf("%c->%c\n",a,c);
    else
    {
        Hanio(n-1,a,c,b);//将上面的n-1个盘子,从a通过c移到b上面
        Move(a,c);//把最下面的盘子,直接从a移到c//printf("%c->%c\n",a,c);
        Hanio(n - 1, b, a, c);//将n-1个盘子,从b通过a移到c上面
    }
}

int main()
{
    Hanio(5,'A','B','C');
    printf("%d\n",g_count);

    return 0;
}
#endif

//int main()
//{
//    //printf("%d\n",Peach(1));
//    //Show(483);
//    clock_t c1 = clock();
//    Fibon1(44);
//    clock_t c2 = clock();
//    printf("循环执行的时间:%d\n",c2-c1);
//    
//    Fibon(44);
//    clock_t c3 = clock();
//    printf("递归执行的时间:%d\n", c3-c2);
//    
//    return 0;
//}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值