函数递归练习题(*)

目录

1.字符串逆序(以abcdef为例)

非递归解法

思路

递归解法 (难点)

思路

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

思路

优化 

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


1.字符串逆序(以abcdef为例)

要求:1.递归实现;2.不能使用C语言中的的字符串操作函数

非递归解法

思路

建立字符数组,利用下标将第一个字符a与最后一个字符f交换,然后左、右下标分别+1和-1将字符b与e交换,以此类推,直到左标=右标

注意点:求字符长度如何使用自定义函数实现

int  my_strlen(char* y)
{
	int count = 0;
	while (*y != 0)
	{
		count++;
		y++;
	}
	return count;
}

void reverse_string(char* x)
{
	int left = 0;
	int right = my_strlen(x) -1;
	while (left < right)
	{
		char temp = x[left];
		x[left] = x[right];
		x[right] = temp;
		left++;
		right--;
	}
}

int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s\n", arr);
	return 0;
}

递归解法 (难点)

思路

1.abcdef,先将a取出

2.f放入a的位置(但此时f的位置不能放入a,因为下一次递归再进行替换,看到的是bcdea,会将b和a交换,因此f位置处应放入'\0'

2.递归的处理是字符串第一个元素与最后一个替换

3.最后将a放回最后一个元素位置

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//字符串逆序(*)——不允许使用字符串操作函数

//递归方式
int  my_strlen(char* y)
{
	int count = 0;
	while (*y != 0)
	{
		count++;
		y++;
	}
	return count;
}

void reverse_string(char* x)
{
	char tmp = *x;//第1步
	int len = my_strlen(x);
	*x = *(x + len - 1);//第2步
	*(x + len - 1) = '\0';//第3步
	
	//判断条件
	if(my_strlen(x+1)>=2)
	{ 
		reverse_string(x + 1);//第4步
	}
	*(x + len - 1) = tmp;//第5步

}
int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s\n", arr);
	return 0;
}

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

思路

每次取完x的个位数后,然后x除以10,进行下一次递归,直到值成为个位数,再将返回值相加

int DigitSum(int x)
{
	int g = 0;
	int m = 0;
	if (x > 10)
	{
		m = x % 10;
		x = x / 10;
		g = m + DigitSum(x);
	}
	else
	{
		g = x;
	}
	return g;

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

优化 

int DigitSum(int x)
{
	if (x > 9)
	{
		return   DigitSum(x/10)+x % 10;
	}
	else
	{
		return x;
	}
}
int main()
{
	int n = 0;
	scanf("%d",&n);
	int r=DigitSum(n);
	printf("%d", r);
	return 0;
}

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

  非递归函数代码: 

double test(int x, int y) 

 {

       int m = 0;
       int num = 1;
      while (m < y)
     {
         num = num * x;
         m++;
     }

      return num; 

}   

double test(int x, int y)
{

	//实现负数
	if (y == 0)
	{
		return 1.0;
	}
	else if (y > 0)
	{
		return x * test(x, y - 1);
	}
	else
	{
		return 1.0 / test(x, -y);
	}
}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d%d", &n, &k);
	double g=test(n,k);
	printf("%lf", g);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值