一.递归实现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;
}