计算斐波那契数
题解:
代码如下:
注意:利用递归的方法求斐波那契数是有缺陷的,当我们要求的数太大时
递归的方法就求不出来了,效率也缓慢,因此求斐波那契数还是用
迭代的方法好
//计算斐波那契数
//非递归(迭代)方法
//斐波那契数就是前两个数之和,我们可以从到到尾依次计算,得出结果
//关键在于n>=3开始依次计算,当n<3时,都为1
int My_get(int n)
{
//定义三个变量
//初始化都为1是因为第一第二个数是构不成斐波那契数的,结果都是1
//因此不需要计算第一第二个数,从第三个数开始计算
int i = 1;
int m = 1;
int a = 1;
while (n >= 3)
{
//依次计算,将数值交换
a = i + m;
i = m;
m = a;
n--;//每计算一次就-1,直到n<3;
}
//n<3时返回1
return a;
}
int main()
{
//输入要求第几个斐波那契数
int n = 0;
scanf("%d", &n);
//调用函数计算
int ret = My_get(n);
printf("%d\n", ret);
return 0;
}
编写一个函数实现n的k次方,使用递归实现
代码如下:
计算一个数的每位之和(递归实现)
代码如下:
字符串逆序(递归实现)
代码如下:
//字符串逆序(递归实现)
/*题解:
*首先我们应理解题目要求,注意并不是实现逆序打印,
* 而是实现反向排序,因此当我们调用函数时,是不需要返回值的
* 实现这一功能应在调用函数内实现.
* 我们先滤清思路:(五部走)
* 1.使用变量存储第一个元素
* 2.最后元素到第一个元素位置
* 3.让最后一个元素位置 = '\0'
* 4.判断每次递归依次实现除了第一、最后的元素位置交换
* 5.将第一元素放到最后元素位置上
* 注意:第三步的原因是,当使用递归时,系统自动读取到'\0'才停止
* 因此 = '\0'是为了交换还未交换的值
*/
int my_strlen(char* arr)
{
//定义变量存放长度
int couse = 0;
//利用循环,实现数组长度计算
while (*arr != '\0')//这里求实际长度,为'\0'之前的元素
{
couse++;//元素长度累加
arr++;//arr为第一个元素,持续加1,直到='\0'完成计算
}
return couse;
}
void reverse_string(char* string)//创建形参字符指针来接受实参元素首地址
{
int right = my_strlen(string) - 1;//最后元素下标
//第一步,将第一个元素暂存
char tmp = *string;
//第二步,让最后元素到第一元素位置
*string = string[right];
//第三步,将最后元素位置给上'\0'
string[right] = '\0';
//第四步,利用判断交换其它元素
if (my_strlen(string + 1) >= 2)//判断条件的意思为,当计算的元素长度>=2时,继续交换,当<2,则只剩1个元素,就没必要交换
{
//递归调用
reverse_string(string + 1);
}
//第五步,将第一元素放到最后元素位置上
string[right] = tmp;
}
int main()
{
//定义数组变量存放字符
char arr[] = "abcdef";
//调用函数
reverse_string(arr);
//打印反向排序的值
printf("%s\n", arr);
return 0;
}
strlen的模拟(递归实现)
递归和非递归分别实现strlen
递归:
递归方法
int my_strlen(char *arr)
{
//判断,strlen求的是'\0'之前元素的个数,因此 = '\0'时不执行
if (*arr != '\0')
{
return 1+my_strlen(arr + 1);//每次递归加1,函数内arr+1的意思为元素依次判断是否 = '\0'
}
return 0;//当元素为'\0'时,则元素长度为0
}
int main()
{
//定义字符数组
char arr[] = "abcdfergtj";
//调用函数并将元素长度返回
int sum = my_strlen(arr);
printf("%s数组的元素长度是:%d\n", arr, sum);
return 0;
}
非递归:
//非递归方法
int my_strlen(char* arr)
{
//定义变量作为元素计数
int num = 0;
//循环依次计算
while (*arr != '\0')
{
num++;//当元素不为'\0'加1
arr++;//依次判断每个元素
}
return num;
}
int main()
{
//定义字符数组
char arr[] = "abcdfergtj";
//调用函数并将元素长度返回
int sum = my_strlen(arr);
printf("%s数组的元素长度是:%d\n", arr, sum);
return 0;
递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
题解:
注意:
求n的阶乘时,当n>1时公式为->n的阶乘 == n * (n-1)的阶乘,n<=1时阶乘就为1
递归方法:
//递归方法:
int my_get(int n)
{
//判断m,当n>1的时候,则需要进行计算
if(n>1)
return n * my_get(n - 1);//这里是求阶乘n的公式->n!=n*!函数(n-1)
return 1;//当n<=1时,阶乘就是n本身1
}
int main()
{
//输入要求的阶乘
int n = 0;
scanf("%d", &n);
//调用函数
int sum = my_get(n);
printf("sum = %d\n", sum);
return 0;
}
非递归方法:
//非递归方法
int my_get(int n)
{
//定义变量进行循环
int i = 0;
//定义变量进行阶乘计算
int m = 1;//初始化为1,为0都为0
for (i = 1; i <= n; i++)
{
m *= i;//阶乘计算
}
return m;//返回
}
int main()
{
//输入要求的阶乘
int n = 0;
scanf("%d", &n);
//调用函数
int sum = my_get(n);
printf("sum = %d\n", sum);
return 0;
}
递归方式实现打印一个整数的每一位
//递归方式实现打印一个整数的每一位
/*
题解:
1.打印一个整数的每一位,要分两种情况,当整数>9时,求出每一位
当整数<10时,不需要求
2.整数%10 == 个位 ->整数/10 == 千百十位....依次类推,就能依次得出每一位
简单来说就是先%出个位,再/出其它位,依次往复,直到小于10
*/
void my_make(unsigned int n)
{
if (n > 9)//n>9时,打印除了个位以外的数
{
my_make(n / 10);//每次递归得出除了个位上的数,然后进行打印
}
printf("%d ", n % 10);//打印个位上的数
}
int main()
{
//输入整数
unsigned int n = 0;
scanf("%u", &n);
//调用函数
my_make(n);
return 0;
}