函数递归(基础习题2)

一.递归实现n的k次方

递归思路:

#include <iostream>
using namespace std;
double Pow(int n,int k)
{
	if (k == 0)
		return 1;
	else if (k > 0)
		return n * Pow(n, k - 1);
	else
		return 1.0 / Pow(n, -k);
}
int main()
{
	cout << "请输入你要计算的数字:";
	int n;
	cin >> n;
	cout << "请输入你要实现的k次方:";
	int k = 0;
	cin >> k;
	double ret = 0.0;
	ret = Pow(n, k);
	cout << ret << endl;
	return 0;
}

二.计算一个数的每位之和(要求输入的是非负整数)

递归思路:

递归条件:只有当n>9才能进入循环,否则返回数字本身

//递归实现一个数(非负整数)的每位之和
#include <iostream>
using namespace std;
int Digitsum(int n)
{
	if (n > 9)
	{
		return Digitsum(n/10) + n % 10;
	}
	else
	{
		return n;
	}
}
int main()
{
	unsigned int n = 0;
	cout << "请输入一个非负整数:";
	cin >> n;
	int ret = 0;
	ret = Digitsum(n);
	cout << ret << endl;
	return 0;
}

三.实现字符串的逆序

递归思路:

--->实现递归的限制条件:数组中扣除首元素与最后一个元素中间的字符串个数>=2

注意:1.不能在函数(即reverse)中计算sz,传过去的只是数组首元素的地址,而不是整个数                组),只能在主函数中进行计算

           2.记得在原来数组末端元素处加上'\0',才能形成字符串

//递归实现字符串的逆序
#include <iostream>
#include <string>
using namespace std;
void reverse(char str[])
{
	int len = 0;
	len = strlen(str);//len=6,计算的是\0以前的
	char tmp;
	tmp = *str;
	*str = *(str+len-1);//2.将数组中的最后一个元素放置数组首元素的位置
	*(str + len - 1) = '\0';//3.记得在原来数组末端元素的位置加上'\0'
	if (strlen(str + 1) >= 2)//实现的递归的限制条件,若中间只有1个字符,则不需要逆序
	{
		reverse(str+1);//4.满足条件时,逆序中间的字符串
	}
	*(str+len-1) = tmp;//5.将临时变量中储存的数组首元素放置数组末端
}
int main()
{
	char str[] = "abcdef";
	reverse(str);//传过去的是表面是数组,实质上传的是数组,因此可以改变原来数组中的字符串排序
	cout << str << endl;
	return 0;
}

--->优化代码:

//法2:交换left和right指定的元素(模仿二分查找)
#include <iostream>
#include <string>
using namespace std;
void reverse(char str[],int left,int right)
{
	char tmp = str[left];
	str[left] = str[right];
	str[right] = tmp;
	if (left < right)//限制条件,当left==right时,便不再运行
		reverse(str, left+1, right-1);
}
int main()
{
	char str[] = "abcdefg";
	int left = 0;
	int right = strlen(str) - 1;
	reverse(str,left,right);
	cout << str << endl;
	return 0;
}

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一些 C++ 中的递归函数习题: 1. 编写一个递归函数,计算 n 的阶乘 ```cpp int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } } ``` 2. 编写一个递归函数,计算斐波那契数列的第 n 项 ```cpp int fibonacci(int n) { if (n == 0 || n == 1) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } ``` 3. 编写一个递归函数,计算一个数字的二进制表示中 1 的个数 ```cpp int countOnes(int n) { if (n == 0) { return 0; } else { return (n % 2 == 1) + countOnes(n / 2); } } ``` 4. 编写一个递归函数,计算一个数字的反转 ```cpp int reverse(int n) { if (n < 10) { return n; } else { return (n % 10) * pow(10, floor(log10(n))) + reverse(n / 10); } } ``` 5. 编写一个递归函数,计算一个字符串的长度 ```cpp int stringLength(string str) { if (str == "") { return 0; } else { return 1 + stringLength(str.substr(1)); } } ``` 6. 编写一个递归函数,判断一个字符串是否是回文字符串 ```cpp bool isPalindrome(string str) { if (str.length() <= 1) { return true; } else if (str[0] != str[str.length() - 1]) { return false; } else { return isPalindrome(str.substr(1, str.length() - 2)); } } ``` 7. 编写一个递归函数,计算一个数组中所有元素的和 ```cpp int arraySum(int arr[], int size) { if (size == 0) { return 0; } else { return arr[0] + arraySum(arr + 1, size - 1); } } ``` 8. 编写一个递归函数,计算一个数组中所有元素的平均值 ```cpp double arrayAverage(int arr[], int size) { if (size == 0) { return 0; } else { return (arr[0] + (size - 1) * arrayAverage(arr + 1, size - 1)) / size; } } ``` 9. 编写一个递归函数,计算一个数组中的最大值 ```cpp int arrayMax(int arr[], int size) { if (size == 1) { return arr[0]; } else { return max(arr[0], arrayMax(arr + 1, size - 1)); } } ``` 10. 编写一个递归函数,计算一个数组中的最小值 ```cpp int arrayMin(int arr[], int size) { if (size == 1) { return arr[0]; } else { return min(arr[0], arrayMin(arr + 1, size - 1)); } } ``` 希望这些练习题能够帮助你练习 C++ 中的递归函数

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值