编写递归函数GetPower(int x,int y),计算x的y次幂,在主程序中实现输入输出。 (用c++相关知识解答)

快啊,求c++牛人
2024-12-04 00:25:00
推荐回答(5个)
回答1:

#include

using namespace std;

//递归实现,效率不高,注意绝对值的取法。算法复杂度log(n),空间复杂度O(logn)

double GetPower(int x, int y)

{

double ret = 0;

bool small = y < 0;

y = (y^(y>>31)) - (y>>31);

if (y == 0) return 1;

if (y == 1) return x;

ret = GetPower(x, y >> 1);

ret *= ret;

if (y&1) ret *= x;

return small ? 1.0/ret : ret;

}

//非递归实现,高效率的方式。算法复杂度log(n),空间复杂度O(1)

double power(int x, int y)

{

double ret = 1;

int sign = y < 0;

y = (y^(y>>31)) - (y>>31);

while (y){

if (y&1) ret *= x;

x *=x;

y >>=1;

}

return sign ? 1.0/ret : ret;

}

int main(void)

{

int x, y;

while (cin >> x >> y){

cout << GetPower(x, y) << endl;

cout << power(x, y) << endl;

}

return 0;

}

扩展资料:

常见递归函数

1、复合算子,设f是n元函数,g1…gn是m元函数,复合算子将f,g1…gn变换成为如下的m元函数h:

h(x1…xm)=f1g1(x1,…xm),…gn(x1,…xm))

2、递归算子,设f是n元函数 (≥0),g是n+2元函数,递归算子将f,g变换成满足下列条件的h+1元函数h:

h(x1,…,xn,0)=f(x1,…xn)

h(x1,…xn,y+1)=g(x1,…xn,y,h(x1,…xn))

3、μ一算子,设f是n+1元函数,如果存在y,使f(x1,…xn,y)=0,我们以μyf(x1…xny)表示这样的y中的最小者,如果使f(x1…xny)=0的y不存在,我们说μyf(x1,…xny)无定义。μ-算子将n+1元函数f变换成下面的几元函数h

h(x1,…xn)=μyf(x1…xny)

回答2:

//楼主,返回值是double吧?万一y是负数呢?比如2的-1次方,不就是0.5了吗?
#include
#include //异常所在的头文件.
using namespace std;
double get_power(int x,int y) throw (logic_error)
{
if(!y && !x)
throw logic_error("异常:0的0次幂"); //如果x和y都为0,0的0次幂没有意义.
else if(!y) //如果y为0,x不为0,返回1,任何非0数的0次幂都是1.
return 1;
int abs_y = y >0 ? y : (-y); //判断y是正是负,取绝对值。
double result;
if(abs_y > 1)
result = x * get_power(x, abs_y - 1);
else
result = x;
return (y > 0) ? result : (1 / result);
//如果y为负数,则取结果的倒数,如果为整数,返回结果。
}
int main()
{
try{
cout< cout< cout< cout< }
catch(exception& exp)
{
cout< }
}

回答3:

#include
using namespace std;
//递归实现,效率不高,注意绝对值的取法。算法复杂度log(n),空间复杂度O(logn)
double GetPower(int x, int y)
{
double ret = 0;
bool small = y < 0;
y = (y^(y>>31)) - (y>>31);

if (y == 0) return 1;
if (y == 1) return x;
ret = GetPower(x, y >> 1);
ret *= ret;
if (y&1) ret *= x;

return small ? 1.0/ret : ret;
}
//非递归实现,高效率的方式。算法复杂度log(n),空间复杂度O(1)
double power(int x, int y)
{
double ret = 1;
int sign = y < 0;
y = (y^(y>>31)) - (y>>31);
while (y){
if (y&1) ret *= x;
x *=x;
y >>=1;
}
return sign ? 1.0/ret : ret;
}

int main(void)
{
int x, y;
while (cin >> x >> y){
cout << GetPower(x, y) << endl;
cout << power(x, y) << endl;
}
return 0;
}

回答4:

#include
using namespace std;
int GetPower(int x,int y){
int result = 1;
for(int i = 0;i < y;i++)
result *=x;
return result;
}
void main(){
int x,y;
cout<<"输入底数x和指数y:";
cin>>x>>y;
cout<<"x的y次幂为 "<cout<}
我没有编译,应该能执行吧。

回答5:

别的应该也能实现啊!为啥一定要递归呢?