初学递归函数
一:知识点
1:C++中一个函数体中出现调用自身的语句,称为直接递归调用。被调用的另一个函数有反过来调用原函数,称为间接递归调用。(间接调用自身)
2:递归的能力在于用有限的语句来定义对象的无限集合。
3:递归程序在执行过程中,一般具有如下模式:
①:将调用程序的返回地址、相应的调用前的变量都保存在系统堆栈中;
②:执行被调用的函数
③:若满足退出递归的条件,则退出递归,并从栈顶上弹回返回地址、取回保存起来的变
量值。继续沿着返回地址,向下执行程序:
④:否则继续递归调用,只是递归调用的参数发生变化:增加一个量或减少一个量,重复
执行直到递归调用结束。
二:典型例题
1:Fibonacci数列:
数列形如:0,1,1,2,3,5,8,13,21,34,55……
推理可知;F(n)=F(n-1)+F(n-2) (n>=3时)
F(1)=0,F(2)=1;
由此可通过公式写成程序:
#include<bits/stdc++.h>
using namespace std;
int F(int n);
int main()
{
int a,b;//a为第几项,b为第a项对应的值
cin>>a;//输入a
b=F(a);
cout<<b<<endl;
}
int F(int n)
{
if (n==1)//第一项的值返回0
return 0;
if (n==2)//第二项的值返回1
return 1;
else//第三项之后运用递归调用,调用提前退出的函数
return F(n-1)+F(n-2);
}
2:汉诺塔问题
传说印度的主神梵天在一个黄铜板上插了3 根宝石针,并在其中一根针上从上到下按从小到大的顺序串上了64个金片。梵天要求僧侣们把金片全部移动到另一根针上去,规定每次
只能移动一片,且不许将大片压在小片上。移动时可以借助第三根针暂时存放金片。梵天说,
这64 个金片全部移至另一根针上时,世界就会在一声霹雳之中毁灭。这就是汉诺塔问题。
(要想把所有的金片全部移到另一个针上并且一次只能移动一片。可以借助另一个针。简单理解为把针从A移到B,借助一个C。先把前n-1个盘移到盘C,再把第n个盘移到B盘上,
类似,把C盘上n-1个盘上的前n-2 个移到A盘,第n-1盘移到B盘,以此类推,一直借助A盘和C盘完成传递。)
代码如下:
include<bits/stdc++.h>
using namespace std;
int M(int n,char a,char c,char b);//定义函数n为第n个盘子,a,b,c分别表示三个针
int main()
{
int m;//一共m个盘子
cin>>m;
M(m,'A','C','B');//实行函数
}
int M(int n,char a,char c,char b)//a-->b,c为过度盘,定义在中间
{
if (n==1)
cout<<a<<"-->"<<b<<endl;
else
{
M(n-1,a,b,c);//把n-1 个盘子移到c针上,通过b过度
cout<<a<<"-->"<<b<<endl;//把剩下的一个移到b上
M(n-1,c,a,b);//n-1个盘子从c移到b,a为过度
}
}
结果 输入 2 输出A-->C A-->B C-->B 即先把上面的盘子从A移到C,再把下面的盘子移到B,再把C上的移到B上。
三:初学递归的心得体会:
运用递归调用可以把一些复杂问题简化为多个简单的小问题去解决,即利用题意给出的一些提示或者推理出其中的函数,进行简化解决。正因为如此,我认为递归的难点则在于去找出这些提示或者推出其中的规律,个人认为可以通过多做一些典型例题去寻找其中的规律,作为一个初学递归的学生我感觉现在的任务则是多去练习一些题去慢慢掌握好递归调用。更希望以后能学好递归去解决一些复杂问题吧。