众所周知,C++写任何代码之前都要有的头文件和命名空间
PS:此代码为实验多次反复修改的结果,如有误请在评论区指出,本人就一初学小菜鸟
还把题目和公式也放进去了
//4、用递归方法求x^n,x和n由键盘输入。递归公式为:
// x n = 1
//y = x^n =
// x * x^(n - 1) n > 1
//函数原型为: long xn(long, long);
#include <iostream>
using namespace std;
不管三七二十一,写完头文件和命名空间就把main函数,主函数里的框架补上
int main()
{
system("pause");//按任意键继续
return 0;//返回正常退出值
}
然后呢,题目不是讲要让用户输入两个值嘛,x和n
那么我们就创建两个变量,并且让用户有机会输入
PS:题目给定的函数类型是long,那我们就依葫芦画瓢,也用Long创建两个变量
int main()
{
long x = 0;
long n = 0;
cout << "请输入需要计算的底数x: ";
cin >> x;
cout << "请输入次幂n: ";
cin >> n;
system("pause");
return 0;
}
然后呢,就是让读者头痛的高数问题了,应该叫分段函数吧
求助于高中数学的残留记忆
不如,就像坐标轴一样,把n==0作为分界点,0和非0分成两个帮派
先把0零帮搞定
emmm,忘了个很重要的问题,得先创建一个xn函数体,给它传入两个参数吧,hiahia还是x,n,类型也是long
long xn(long x, long n)
{
}
然后就是完善结构体啦
题目没有用void,所以就有返回值,我们就先让它return 0吧,hiahia很万能的返回正常退出值
long xn(long x, long n)
{
return 0;
}
emmm,思索片刻,刚刚我们讲到把它分为两个帮派讨论
当n==0时,x^0,都是零
还少个变量来接受x,n他两的变化
那就来个跟题目一样的y吧
既然我们给了一个y是接受结果的,那我们也就明确点,给它点明了,我们要返回的就是y
long xn(long x, long n)
{
int y = 0;
if (n == 0)//如果次幂n是0,底数变为1并传递给接收结果的变量y
{
y = 1;
//cout << "y = " << y << endl;
}
return y;
}
搞定了0帮,那我们还有个非0帮
非0帮又分为 左派和右派
左派呢就是0左边的一堆数组,负数啦,也就是n<0的情况
思路是整体分两帮,0帮和非0帮,所以非0的放else里
我们这里千万不要在每个条件语句里单独做反动分子私自输出哈,return这个老大哥会生气的哈
不信的话,试试也不会报错,只是,结果嘛,就是满足条件的都输出了
long xn(long x, long n)
{
int y = 0;
if (n == 0)//如果次幂n是0,底数变为1并传递给接收结果的变量y
{
y = 1;
//cout << "y = " << y << endl;
}
else//n>1
{
if (n < 0)//n<0
{
x = 1 / x;
n = -n;
y = x * xn(x, n);
//cout << "y = " << y << end;
}
}
return y;
}
细化,非零,解决了做派负数,还有右派正数,正数又有一个1可以作为分界点,0到1之间
if之外的if 就是else if
这里为啥能用xn这个函数呢,emmm,就当他已经可以用了,梅开二度吧,具体原理,以我的能力,目前也解释不了(高手都在评论区)
long xn(long x, long n)
{
int y = 0;
if (n == 0)//如果次幂n是0,底数变为1并传递给接收结果的变量y
{
y = 1;
//cout << "y = " << y << endl;
}
else//n>1
{
if (n < 0)//n<0
{
x = 1 / x;
n = -n;
y = x * xn(x, n);
//cout << "y = " << y << endl;
}
else if (0 < n < 1)
{
y = x * xn(x, 1 / n);
}
}
return y;
}
0到1之间的解决了,那就还有一个1咯,n==1
那好办,底数x本身呗
long xn(long x, long n)
{
int y = 0;
if (n == 0)//如果次幂n是0,底数变为1并传递给接收结果的变量y
{
y = 1;
//cout << "y = " << y << endl;
}
else//n>1
{
if (n < 0)//n<0
{
x = 1 / x;
n = -n;
y = x * xn(x, n);
//cout << "y = " << y << endl;
}
else if (0 < n < 1)
{
y = x * xn(x, 1 / n);
}
else if (n == 1)//n=1
{
y = x;
//cout << "y = " << y << endl;
}
}
return y;
}
最后一个右派就是,n>1啦,套公式
这里为什么用else if 而不用else,纯属个人习惯,习惯把控所有数字,给他们圈定一个范围,这里用else也可以
long xn(long x, long n)
{
int y = 0;
if (n == 0)//如果次幂n是0,底数变为1并传递给接收结果的变量y
{
y = 1;
//cout << "y = " << y << endl;
}
else//n>1
{
if (n < 0)//n<0
{
x = 1 / x;
n = -n;
y = x * xn(x, n);
//cout << "y = " << y << endl;
}
else if (0 < n < 1)
{
y = x * xn(x, 1 / n);
}
else if (n == 1)//n=1
{
y = x;
//cout << "y = " << y << endl;
}
else if (n > 1)
{
y = x * xn(x, n - 1);
//cout << "y = " << y << endl;
}
}
return y;
}
到了这里我们的函数已经封装完成了,接下来就是调用了
它是不是有返回值,所以我们在main函数里给它创建一个接收函数里面的返回值y的一个,来个汇总sum吧
再传入我们让用户输入的两个值,就算大功告成啦
int sum=xn(x,n)
int sum;
sum=xn(x,n);
//或者直接一步到位
int sum=xn(x,n);
接下来,请欣赏全部代码
//4、用递归方法求x^n,x和n由键盘输入。递归公式为:
// x n = 1
//y = x^n =
// x * x^(n - 1) n > 1
//函数原型为: long xn(long, long);
//此代码为实验多次,反复修改的结果
#include <iostream>
using namespace std;
long xn(long x, long n)
{
int y = 0;
if (n == 0)//如果次幂n是0,底数变为1并传递给接收结果的变量y
{
y = 1;
//cout << "y = " << y << endl;
}
else//n>1
{
if (n < 0)//n<0
{
x = 1 / x;
n = -n;
y = x * xn(x, n);
//cout << "y = " << y << endl;
}
else if (0 < n < 1)
{
y = x * xn(x, 1 / n);
}
else if (n == 1)//n=1
{
y = x;
//cout << "y = " << y << endl;
}
else if (n > 1)
{
y = x * xn(x, n - 1);
//cout << "y = " << y << endl;
}
}
return y;
}
int main()
{
long x = 0;
long n = 0;
cout << "请输入需要计算的底数x: ";
cin >> x;
cout << "请输入次幂n: ";
cin >> n;
//scanf("%d%d\n", &x, &n);//录入用户输入的两个数据
int sum=xn(x, n);
cout << "y=" << sum << endl;//输出函数返回的结果,在最后一步统一输出,否则,每一个条件,只要n>1的都会输出
system("pause");
return 0;
}