一.计算斐波那契数
递归和非递归分别实现求第n个斐波那契数
例如:
输入:5 输出:5
输入:10, 输出:55
输入:2, 输出:1
#include<stdio.h>
//int fib(int n) //调用的函数太多,会非常缓慢,也有可能栈溢出
//{
// if(n == 3) //计算fib(3)调用了多少次
// count++;
// if (n <= 2)
// {
// return 1;
// }
// else
// {
// return fib(n - 1) +fib(n - 2);
// }
// return 0;
//}
int fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
for (int i = 3; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", fib(n));
return 0;
}
二.字符串逆序(递归实现)
编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:char arr[] = "abcdef";
逆序之后数组的内容变成:fedcba
#include<stdio.h>
//void reverse_string(char arr[]) //基本方法,数组形式
//{
// int l = 0;
// int r = strlen(arr)-1;
//
// while (l<r)
// {
// char tmp = arr[l];
// arr[l] = arr[r];
// arr[r] = tmp;
// l++;
// r--;
// }
//}
int Strlen(char* str) //不用strlen,用函数实现求字符串长度
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
//void reverse_string(char* str)
//{
// int l = 0;
// int r = Strlen(str) - 1;
//
// while (l < r)
// {
// char tmp = *(str + l);
// *(str + l) = *(str + r);
// *(str + r) = tmp;
//
// l++;
// r--;
// }
//}
void reverse_string(char* str) //指针形式
{
int len = Strlen(str);
char tmp = *str;
*str = *(str + len - 1);
*(str + len - 1) = '\0';
if(Strlen(str+1)>=2)
reverse_string(str+1);
*(str + len - 1) = tmp;
}
//void reverse_string(char* str) //指针形式
//{
// int l = 0; //不能sizeof,是指针
// int r = strlen(str) - 1;
//
// while (l < r)
// {
// char tmp = *(str + l);
// *(str + l) = *(str + r);
// *(str + r) = tmp;
//
// l++;
// r--;
// }
//}
int main()
{
char arr[] = "abcdef";//fedcba
reverse_string(arr);//arr是数组名,数组名是数组首元素的地址
printf("%s\n", arr);//fedcba
return 0;
}
三.递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
#include<stdio.h>
int factorial(int n) //n过大,函数会栈溢出(递归层次太深)或者大于Int类型范围;
{
if (n == 1)
{
return 1;
}
else if (n > 1)
{
return n * factorial(n - 1);
}
}
//#include<stdio.h> //非递归
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int ret = 1; //用来求乘积
// for (int i = 1; i <= n; i++)//产生1-n的数字,第一次i=1,第二次i=2...
// {
// ret = ret * i; //乘积
// }
// printf("%d\n", ret);
// return 0;
//}
int main()
{
int n = 0;
scanf("%d", &n); //只能执行一定的值,因为int类型有存储限制;
printf("%d\n", factorial(n));
return 0;
}