一.斐波那契数列
所谓斐波那契数列,就是 1 1 2 3 5 8 13 21 .......这样的数列。第一位和第二位都是1,从第三位开始,为前两数之和,即F(n)=F(n-1)+F(n-2)
1.递归方式
int Fei(int n)
{
int a = 1; //初始化第一个数
int b = 1; //初始化第二个数
int c = 1;
if (n < 3) //当传入的n本身就小于3,或者当递归到n小于3时,返回并带回返回值3
{
return c;
}
else
{
//实现将前两个数之和赋给后一位,将前两个数较大的那一个赋给原来是这两数之和的位置
//举例:1 1 2 3 5 其中第二、三位相加是 1+2=3 那么,将3赋给第四位,将1和2中较大的那个赋给第三位
int temp = a + b;
a = b;
b = temp;
c = a + b;
n--; //n--,不断逼近跳出递归的条件
}
return Fei(n) + Fei(n - 1); 注意这里n是自减过的,所以是F(n) + F(n-1)
}
(1)运行结果
二.m的k次方
1.递归实现
int Pow(int n, int k)
{
int i = 0;
int ret = 1; //计算n的k次方,我们设置一个返回值来存储最终结果
for (i = 0; i < k; i++)
{
ret *= n; //注意ret的值不能初始化为0,否则0乘任何数都将是0
}
return ret;
}
三.计算一个数的每位之和
1.本题思想
举例:若我们想求 1234 的每位之和Sum(1234),我们可以将其简化成 Sum(123) + 4 再简化为
Sum(12) + 3 + 4 再简化为 Sum(1) + 2 + 3 + 4 最后变成 1 + 2 + 3 + 4
2.递归实现
int Sum(int n)
{
int s; //s用来存储每一次递归时n的值
int ret = 0;
if (n > 9)
{
s = n / 10;
ret = n % 10; //ret存储每一次递归时的个位数
}
else
return n;
return Sum(s) + ret;
}
3.运行结果
四.字符串逆序
1.本题思想
我们想要将一个字符串实现逆序,比如"abcdef"这个字符串,那我们可以将其简化为
逆序"bcde" + 首尾的 a 和 f 实现交换, 逆序"bcde"又可以简化为逆序"cd" + b 和 e 实现交换,
逆序"cd" 则简化为 c 和 d 交换。 这样递归结束后,字符串逆序也就实现了。
需要注意:这里所说的逆序不是将字符串的内容逆序打印出来,而是改变其存储顺序。
所以在传参时,我们需要传址而非传值。
2.递归实现
#include<stdio.h>
void Back(char* arr,int left,int right)
{
if (left < right) //当左端的下标<右端的下标时,交换两端的字符
{
char temp = 0;
temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
//交换完成后,需要将左端的下标+1,右端的下标—1
left++;
right--;
}
else
return;
return Back(arr , left,right);
}
int main()
{
char arr[] = "abcdef";
int sz = sizeof(arr) / sizeof(arr[0]) - 1;//计算出字符串除'\0'以外的长度
//减去1是因为字符串的末尾是'\0'
Back(arr,0,sz-1); //0是传入的左端的字符的下标(即第一个字符的下标)
//sz-1是右端的字符的下标
printf("%s", arr);
return 0;
}
3.运行结果
五.strlen的模拟实现
1.递归实现
int Strlen(const char* arr)
//注意,我们只是想计算字符串长度,并不想对其内容产生影响,所以使用const修饰,使其更健壮
{
if (*arr != '\0')
{
return Strlen(arr + 1) + 1; //一次递归时,arr+1表示从之前的指向的字符地址往后移一位
}
else
return 0;
}
2.非递归实现
int my_strlen(const char* arr)
{
int count = 0; //定义一个count来计数
while (*arr != '\0')
{
count++;
arr += 1;
}
return count;
}
3.运行结果
六.n的阶乘
1.递归实现
int Fac(int n)
{
if (n > 0)
{
return Fac(n - 1) * n;
}
else
return 1;
}
2.非递归实现
int Fact(int n)
{
int i = 0;
int ret = 1;
for (i = 1; i <= n; i++)
{
ret *= i;
}
return ret;
}
3.运行结果
七.打印一个整数的每一位
1.递归实现
void Print(int n)
{
if (n > 9)
{
int ret = n / 10;
Print(ret);
}
int k = n % 10;
printf("%d ", k);
}
//也可写成以下代码
void Print(int n)
{
if (n > 9)
{
Print(n/10);
}
printf("%d ", n%10);
}
2.运行结果
希望以上内容对你有所帮助。