2019年1月22日C++学习

2019年1月22日C++学习
函数递归调用
山东农业大学数学类4班赵景乐
一、思路
有时候函数需要调用自身,这时候就用到了函数递归调用。需要注意的是,函数递归调用并不能解决函数不能解决的问题。
二、知识点
其实在函数递归调用中直接调用函数本身就可以,如计算:

提取一个x后,发现后一个式子与前一个式子有相似的部分,这就是所谓的调用函数自身,那么写如下的程序:
#include
using namespace std;
int M(int x,int n)
{
int s;
if(n= =1) s=x;
else s=x*(1-M(x,n-1));
return s;//s便于单输出//
}
int main()
{
int x,n,s;
cin>>x>>n;
s=M(x,n);
cout<<s;
}
因为函数简单,可以写成双输出,减少长度:
int M(int x,int n)
{
int s;
if(n= =1) return x;
else return x*(1-M(x,n-1));
}
该函数的运行过程如下(以输入3 3为例):
M(3,3)
{
x=3;n=3;
s=x*(1-M(3,2));
M(3,2)
{
x=3;n=2;
s=x*(1-M(3,1));
M(3,1)
{
s=3;
}
M(3,1)=3;
s=3*(-2)=-6;
}
M(3,2)=-6;
s=37=21;
}
M(3,3)=21;
在了解了函数递归调用的调用具体步骤后,我们看一下在思路上的问题。在用数学方法算出递归条件后,在编写代码时要注意结束条件,在这个例子中,n是递减的,当n是1的时候M(3,1)就是3,但条件不能写成M(3,1)=3;因为等式左边不能是变量。
类似上例的问题是有数学方法解决的,而有些问题这不能,我们就要简化问题,找到简化后的,具有相似性的小问题。
世界末日问题:
有64个中空圆环套在A杆上,从下到上其直径递减,现要将其从A杆上借助B杆转移到C杆上,一天只能移动一个,且每个杆上必须是大环在小环下面,当全部转移过去的时候世界末日就到了,问到世界末日还有几天。
在没有思路的时候,可以从简单的想起,如:
只有一个环:直接将其从A杆移动到C杆。但与上面的问题关联不大。
有两个环:先将小的移动到B杆,再将大的移动到C杆,再将小的移动到C杆。可以看出这个就有相似性。那我们假设有N个环,分成最大的一个和之前的N-1个。那么现在看来,这个问题和上个例子就有了相似的部分。现假设 A杆上有N个中空圆环,求到世界末日的天数。代码如下:
#include
using namespace std;
int M(int x)
{
int d=0;/每次小运算的天数/
if(x= =1) d=1;
else{
d+=1+2
M(x-1);/将其余环移动到B杆上,将最大环移动到C杆,再将B杆上的环移动到C杆上,所以是1+2倍的M(x-1)/
}
return d;
}
int main()
{
int x,d;
cin>>x;
d=M(x);
cout<<d;
}
不过需要注意的是天数会成爆炸式增长,而int型变量可能没法记录下。
因为格式问题代码中两个等号之间多一个空格,验证代码时须删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值