有关递归的一些思考

最近topcoder和网易一起举办了一场比赛。由于消息不够灵通,所以并没有参加比赛,但是事后我仍去看了下题目。

一共有2道题。这里我来说一下第二题。题目有点细节有点记不得了,大致意思如下:

有一字符串A,A="0",如果A得长度小于等于n(n是输入的),则建立一个相同长度的字符串B,并执行以下循环:

                      for i = 0,1,……, strlen(A)

                           如果 i是完全平方数,那么  B[i] = '1' - A[i]

                           否则,B[i] = A[i] 

                      A = A + B  (表示把字符串B接在A字符串后,然后全体赋给A)

最后return的值为A[n]。 

这道题我用的方法是递归。

以前一直不知道该什么时候去用一个递归算法,也一直难以理解递归的思路。但是后来发现,一个递归思路的诞生往往是一个很自然的过程。

就比如这道题,思路是这样的:要求A[n] --> A[n]是前一轮字符串B中的某一项,我们设为第i项,记为B[i] -->前一轮中的B[i]是由前一轮中的A[i]经过一定的规律变换而来的 --> 到这里发现又回到了求A[i]的问题上,接下去的问题也就跟前面的过程一模一样了 --> …… --> 那么一次类推,什么是最开始的问题呢?就是A[0]='0' !于是这也成为了整个过程的出口。 

回顾上面的过程,我们发现,一个个完整的递归已经呈现,包括最后的递归出口。 

当一个事件发生过程中的每一个步骤,都产生于上一个步骤的结果,而当前步骤的结果又会进一步影响后一步结果,并且在每一个步骤中的实现过程又非常类似的时候,这便是一个递归的结构。

下面贴出主要代码,仅供参考。为了意思表述的方便,对于只能用于double和float的函数就直接用在int上了。

int getvalue(int N) {

    
if (N == 0)   //递归出口
        return 0;

    
int tmp;
    tmp 
= N - pow(2,log(N)/log(2));   //计算A[n]在前一轮中B字符串中的位置
    
    
if (squr(tmp)) {   //squr是自定义函数,当tmp为完全平方数时返回true
        return (1 - getvalue(tmp));
    }
    
else 
        
return getvalue(tmp);

} 

 

 

 

 

 

 

 

posted @ 2009-06-02 16:17  DeMo  阅读(251)  评论(0)    收藏  举报