C语言-函数递归-11

1、接受一个整型值(无符号),按照顺序打印它的每一位。 例如:输入:1234,输出1234.

unsigned int num = 0;声明并初始化了一个名为num的无符号整数变量,并将其赋值为0。使用unsigned int类型表示该变量只能存储非负的整数值,范围从04294967295

Print函数:函数 print 是一个递归函数,用于逆序打印一个无符号整数的每一位数字。

本例:如果 n 大于 9,函数会递归调用自身,传递 n 除以 10 的商作为参数。这样会将 n 的最高位去除,将剩余的数字传递给下一层递归函数。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void print(unsigned int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	unsigned int num = 0;
	scanf("%u", &num);
	print(num);
	return 0;
}

2、编写函数不允许创建临时变量,求字符串长度

字符串在 C 语言中是以字符数组的形式存储的,而字符数组可以通过指针来表示。

当我们将一个字符串传递给函数时,实际上我们只传递了字符串的首地址,也就是指向字符串第一个字符的指针。使用指针可以更方便地访问、操作字符串中的字符。

 my_strlen 函数中,因为它是用来计算字符串长度的函数,所以参数 str 的类型被声明为 char*。通过递增指针 str 的方式,我们在循环中遍历每个字符直到遇到字符串的结束符 '\0'。这里的指针 str 就相当于一个迭代器,它指向字符串中的字符,通过不断递增指针的方式,我们可以依次访问字符串中的每个字符,从而计算字符串的长度。

while (*str != '\0') 判断指针 str 指向的字符是否为字符串结束符 '\0'

str++ 是用于将指针 str 的值递增,使其指向下一个字符。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str!= '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "bit";
	//['b']['i']['t']['\0']
	printf("%d\n",my_strlen(arr));
	return 0;
}

递归求字符串长度

数中的判断语句 if (*str != '\0') 判断指针 str 指向的字符是否为字符串结束符 '\0',如果不是,则执行 return 1 + my_strlen(str + 1),这样就实现了递归调用,将指针指向下一个字符,并通过返回值不断累加计算出字符串的长度。如果指针 str 指向的是字符串结束符 '\0',则返回值为 0,表示字符串的长度为零。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
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;
}

3、递归与迭代

求n的阶乘(不考虑溢出)

一)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int n = 0;
	printf("请输入一个整数:");
	scanf("%d", &n);
	int i = 0;
	int ret = 1;
	for (i = 1;i <= n;i++)
	{
		ret = ret * i;
	}
	printf("%d\n", ret);
	return 0;
}

二)递归函数的方式计算整数的阶乘

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * Fac(n - 1);
}
int main()
{
	int n = 0;
	printf("请输入一个整数:");
	scanf("%d", &n);
	int ret = Fac(n);
	printf("%d\n", ret);
	return 0;
}

4、求第n个斐波那契数。(不考虑溢出)

(一)效率低

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int Fib(int n)
{
    if (n <= 2)
        return 1;
    else
        return Fib(n - 1) + Fib(n - 2);
}
int main()
{
    int n = 0;
    printf("请输入一个整数:");
    scanf("%d", &n);
    int ret = Fib(n);
    printf("%d\n", ret);
    return 0;
}

(二)递归可以求解,但是效率偏低

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int count = 0;  
int Fib(int n)
{
	if (n == 3)  //统计第三个斐波那契数的计算次数
		count++;
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}
int main()
{
	int n = 0;
	printf("请输入一个整数:");
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n", ret);
	printf("count=%d\n", count);
	return 0;
}

(三)在函数内部,定义了三个整型变量 ab  c,并初始化为 1,它们分别表示斐波那契数列的第 n-2n-1  n 项。

使用 while 循环进行迭代计算,直到 n 递减到 2 以下。在每次迭代中,计算出当前项 c 的值,并将前两项 a  b 更新为下一次循环所需的值。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main() 
{
	int n = 0;
	printf("请输入一个整数:");
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d\n",ret);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值