浅谈学习中遇到的递归问题
对于算法才刚刚入门的编程学习者而言,我感觉平时的积累是必不可少的。就我自己而言,我对于新的知识有一种想迅速变成自己的思想的冲动,在平时做题时,遇到了新的函数、新的思想,能大大简化自己的程序,比如STL标准模版库的应用,新函数如swap()的应用,还有诸如位运算的大大简化运算步骤等等,我都详细记下,并尽快适用这些新知识应用到自己的程序中。
经过几天的学习,对于递归算法我有了初步的理解,对于平时遇到的问题我有以下的总结:
1.递归的构成很简单,应用于子函数,含义上即为函数的循环往复的调用自己,在某一个终止条件的控制下跳出调用,回溯计算,理解为函数计算的现场还原。
这就要注意终止条件的选择,一般的在积累问题方面的计算应用较多,所以选择积累变量作为终止条件,即当终止变量为n时,让函数返回一个确定的值,之后最里层的调用会终止跳出,栈从顶至底不断往外吐出元素,从而实现运算。比如阶乘和累加,下面是阶乘的c++源代码:
#include<iostream>
using namespace std;
int multiply(int n)
{
int s;
if(n==1)return 1;//当n=1时终止,并开始回溯计算
else return n*multiply(n-1);//当n>1时每次令n-1并且使其调用函数本身
}
int main()
{
int n,a;
cin>>n;
a=multiply(n);//调用子函数int multiply(int n)
cout<<a<<endl;
return 0;
}
2.例题尽量多搜集,总结是我们初学者的必须拥有的品质。除了阶乘、累加外,凡是涉及到问题积累的,可以考虑用递归算法解决,比如斐波那契数列问题、典型的母牛问题(有些地方也称兔子问题,是斐波那契数列问题的衍生)、全排列等等都可以应用加以解决。以下是对于斐波那契数列求解的源代码:
#include<iostream>
using namespace std;
int fib(int n)
{
if(n<=1)return 1;
return fib(n-1)+fib(n-2);
}
int main()
{
int n,a;
cin>>n;
a=fib(n-1);
cout<<a<<endl;
return 0;
}
浙公网安备 33010602011771号