函数递归练习题

文章介绍了如何使用递归实现n的k次方计算、非负整数的数字和函数DigitSum,以及不使用库函数的字符串反转函数reverse_string。
摘要由CSDN通过智能技术生成

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

在这里插入图片描述


double mypow(int n, int k)
{
	if (k == 0)//k=0
		return 1;
	else if (k > 0)//k>0
		return n * mypow(n, k - 1);
	else//k<0
		return 1 / mypow(n, -k);

}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d", &n, &k);
	double ret = mypow(n, k);
	printf("%lf\n", ret);

	return 0;
}

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

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

下面是两个版本的函数,都可以实现此功能,区别就在于递归停止条件不同。

int DigitSum(int n)//版本1:函数多调用了一次
{
	if (n != 0)
		return n % 10 + DigitSum(n / 10);
	else
		return 0;
}

int DigitSum(unsigned int n)//版本2:效率比版本1高
{
	if (n <= 9)
		return n;
	else
		return DigitSum(n / 10) + n % 10;
}


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

	return 0;
}

编写一个函数 reverse_string(char * string)(递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
思路分析
不妨先看一下下面补充的非递归的实现方法,函数体内实现了元素交换,从两头开始到中间进行元素交换,递归的实现方法也是基于这种思想的。
算法图解

  • 第一步,将a放入一个临时变量当中
  • 第二步,将f放入a的位置,也就是把f赋值给a
  • 第三步,将‘\0’放入f之前所在的位置
  • 第四步,将中间4个元素进行递归
  • 第五步,将a放入’\0’所在的位置

第一,第二,第五步应该好理解,就是进行元素交换嘛。
第三步的作用将’\0’放在后面时,数组的结束标志就向前移动一位,那么第四步调用函数的时候计算字符串长度的时候,因为是mystrlen(arr+1),指针向后移动一位,而结束符’\0’向前移动一位,字符串长度正好减少2,把交换过的元素排除掉,这样调用函数reverse_string(string + 1),就直接能进行中间元素的元素交换

size_t mystrlen(char arr[])
{
	if (*arr == '\0')
		return 0;
	else return 1 + mystrlen(arr + 1);
	
}


void reverse_string(char* string)
{
	size_t sz = mystrlen(string);
	char tmp = string[0];
	string[0] = string[sz - 1];
	string[sz - 1] = '\0';
	if (strlen(string+1)>=2)//当字符串长度为1或为0时,不再递归
	{
		reverse_string(string + 1);
	}
	string[sz - 1] = tmp;

}

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

	return 0;
}

补充:非递归实现

size_t mystrlen(char arr[])
{
	size_t count = 0;
	while (*arr != '\0')
	{
		count++;
		arr++;
	}
	return count;
}
void reverse_string(char* string, size_t sz)
{
	size_t left = 0;
	size_t right = sz - 1;
	while (left < right)
	{
		int tmp = string[left];
		string[left] = string[right];
		string[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s\n", arr);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值