C语言练习题(递归)

目录

1.接受一个整型值(无符号),按照顺序打印它的每一位。

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

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

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

5.编写一个函数 reverse_string(char * str)(递归实现)

6.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

7.编写一个函数实现n的k次方,使用递归实现。


1.接受一个整型值(无符号),按照顺序打印它的每一位。

例如:
输入:1234,输出 1 2 3 4

思路:我们应该想的是print函数可以把每一位给打出来。这样就会有下面这一系列的思考。
print(1234)
print(123)4  先将123的每一位打印出来,在打印4
print(12)3 4  先将12的每一位打印出来,在打印3。在打印4.
print(1)2 3 4  ........

#include <stdio.h>

void print(int n)
{
	if (n > 9)
	{
		print(n/10);
	}
	printf("%d ", n % 10);


}

int main()
{
	unsigned int num = 0;
	scanf("%d", &num);//1234
	print(num);
	return 0;
}

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

我们的函数每次是要求字符串长度的,传进去的参数只是字符串的首地址而已,那我们就将首个字符的长度算出来,然后逐一去递归。 

my_strlen("abcd")     
1 + my_strlen("bcd")
1+1+my_strlen("cd")
1+1+1+my_strlen("d")
1+1+1+1+my_strlen("")

int my_strlen(char* str)
{
	if (*str != '\0')
	{
		return 1 + my_strlen(str+1);
	}
	else
		return 0;
}

int main()
{
	char arr[] = "abcd";
	int len = my_strlen(arr);
	//len = strlen(arr);
	printf("%d\n", len);
	
	return 0;
}

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

思路:n的阶乘 = n*(n-1)*(n-2)........*1;而我们定义的fac函数就是求阶乘的,所以只要每次将n的值传进去即可。

int fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * fac(n - 1);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac(n);
	printf("%d ",ret);
	
	return 0;
}

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

思路:斐波那契数列:1 1 2 3 5 8 13 21 34 55......而我们可以根据这个特性,写出数学表达式。然后写出代码即可。

int fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return fib(n - 1) + fib(n - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fib(n);
	printf("%d ", ret);
	return 0;
}

5.编写一个函数 reverse_string(char * str)(递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印。

要求:不能使用C函数库中的字符串操作函数。

比如 : "abcdef"  变成 "fedcba"

思路:每次调用 reverse_string函数的时候,先将字符串首尾两个字符交换,但要注意末尾的字符需要填充字符‘\0’,因为要得出新字符串的末尾位置。

#include <stdio.h>
#include <string.h>

void reverse_string(char* str)
{
	int len = strlen(str);
	char tmp = *str;
	*str = *(str + len - 1);
	*(str + len - 1) = '\0';

	if (strlen(str + 1) >= 2)
		reverse_string(str + 1);

	*(str + len - 1) = tmp;
}

int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);

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

6.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

输入:1729,输出:19

思路:和第一题的思路大致相同。

#include <stdio.h>

int DigitSum(int n)
{
	if (n > 9)
    	return (n % 10) + DigitSum(n / 10);
	else
		return n;
}

int main()
{
	int num = 0;
	scanf("%d", &num);
	int ret = DigitSum(num);
	printf("%d\n", ret);
	return 0;
}

7.编写一个函数实现n的k次方,使用递归实现。

思路:注意k的取值即可。 

double power(int n, int k)
{
	if (k > 0)
		return n * power(n,k - 1);
	else if(k == 0)
		return 1;
	else
		return 1.0 / power(n, -k);
}

int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d", &n,&k);
	double ret = power(n, k);
	printf("%.1f\n", ret);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_63562631/article/details/125558351