使用递归实现斐波那契数列、k的n次方、计算一个数的每位之和、字符串逆序、strlen、n的阶乘、打印一个整数的每一位(部分包含非递归方式)

一.斐波那契数列

所谓斐波那契数列,就是 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.运行结果

希望以上内容对你有所帮助。 

  • 20
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杯酒问苍天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值