C++用递归方法求x^n,x和n由键盘输入完整可运行源代码及过程

24 篇文章 0 订阅

众所周知,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;
}

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值