有关递归的一些思考
最近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上了。
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);
}

浙公网安备 33010602011771号