#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;
//}