函数递归常用题- -图解- -C语言基础知识点5

一个整形值(无符号),按照顺序打印它的每一位6

输入:1234 输出 1 2 3 4

void print(unsigned int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	unsigned int num = 0;
	scanf("%u", &num);//1234
	print(num);//printf函数可以打印参数部分数字的每一位
		return 0;
}

在这里插入图片描述
图解:
在这里插入图片描述

计算一个数的每位之和

int DigitSum(int n)
{
	if (n > 9)
	{
		return DigitSum(n / 10) + n % 10;
	}
	else
	{
		return n;
	}
}
int main()
{
	int num = 1729;
	int sum = DigitSum(num);

	printf("%d\n", sum);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

打印字符的长度

  • 函数方法
int my_strlen(char *str)
{
	int count = 0;
	while (*str != 0)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = { "bit" };
	printf("%d\n", my_strlen(arr));
	return 0;
}

在这里插入图片描述

  • 递归方法
int my_strlen(char *str)
{
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}
int main()
{
	char arr[] = "bit";

	printf("%d\n", my_strlen(arr));
	return 0;
}

图解
在这里插入图片描述

求阶乘

  • 函数方法
//int main()
//{
//	int n = 0;
//	scanf_s("%d", &n);
//	int i,ret=1;
//	for (i = 1; i <= n; i++)
//	{
//		i = i*ret;
//	}
//	printf("%d", i);
//}
  • 递归方法
int fac(int n)
{
	if (n <2)
		return 1;
	else 
		return  n * fac(n-1);
}
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int ret = fac(n);
	printf("%d", ret);
}

在这里插入图片描述
图解
在这里插入图片描述

编写一个函数实现n的k次方

  • 考虑n>0和n<0的情况
double Pow(int n, int k)
{
	if (k == 0)
		return 1.0;
	else if (k > 0)
		return n * Pow(n, k - 1);
	else
		return 1.0 / (Pow(n, -k));
}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d", &n, &k);
	double ret = Pow(n, k);
	printf("%lf\n", ret);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

字符串逆序

写法1:

//void reverse_string(char* str)
//{
//	int left = 0;
//	int right = strlen(str) - 1;
//
//	while (left < right)
//	{
//		char tmp = *(str + left);
//		*(str + left) = *(str+right);
//		*(str+right) = tmp;
//		left++;
//		right--;
//	}
//}
void reverse_string(char* str)
{
	int len = strlen(str);
	if (strlen(str + 1) >= 2)//中间元素交换
	{
		char tmp = *str;
		*str = *(str + len - 1);
		*(str + len - 1) = '\0'; //先把要放a的位置先放\0,然后让中间的元素先交换完,最后再把a交换放上去
		reverse_string(str + 1);
		*(str + len - 1) = tmp;
	}
}
#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);//数组名arr是数组arr首元素的地址
	printf("%s\n", arr);
	return 0;
}

在这里插入图片描述
写法2:

char *reverse(char *str)
{
	int len = strlen(str);
	if (len > 1)
	{
		char temp = str[0];
		str[0] = str[len - 1];
		str[len - 1] = '\0';      // 最后一个字符在下次递归时不再处理   
		reverse(str + 1);         // 中间元素的处理   
		str[len - 1] = temp;
	}
	return str;
}
int main()
{
	char str[100];
	gets(str);
	reverse(str);
	puts(str);
	return 0;
}

效率低的斐波那契数

  • 递归不合适,递归太慢,且递归太深程序会崩溃出现栈溢出
//int fib(int n)
//{
//	if (n <= 2)
//		return 1;
//	else
//		return fib(n - 1) + fib(n - 2);
//}
//int main()
//{
//	int n = 0;
//	scanf_s("%d", &n);
//	int ret = fib(n);
//	printf("%d\n", ret);
//	return 0;
//}

斐波那契改进(递归不合适,但必须要递归,因为下面会导致栈溢出

int fib(int n)
{
	int a = 1; //(效率高,但是整形有限,可能数字过大会出错)
	int b = 1;
	int c = 0;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int ret = fib(n);
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述`
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值