浅谈学习中遇到的递归问题

对于算法才刚刚入门的编程学习者而言,我感觉平时的积累是必不可少的。就我自己而言,我对于新的知识有一种想迅速变成自己的思想的冲动,在平时做题时,遇到了新的函数、新的思想,能大大简化自己的程序,比如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;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2013-08-01 20:33  金仁赫  阅读(309)  评论(0)    收藏  举报

导航