记得研究生面试的时候,面试老师问了这样一个问题:说说你队递归的理解。 顿时我就懵了,什么是递归。。。当时我想到了什么八皇后(好像我说得也没错呀~八皇后就是典型的递归+回溯),然后就胡说了一通。当时我导师也在那,真的感觉太丢脸了。一个科班出身的人,学了三年编程,竟然不知道怎么描述递归。~~~~(>_<)~~~~ 今天看了C语言的科学与艺术这本书上刚刚有讲递归的这章,认真再去学习学习。唯一给我安慰的一句话是:很多人要花很多年时间才能有效的运用递归。哈哈,看来我还不是很笨哈。下面就来总结下递归的知识吧。
递归(Recursion)
递归是指把一个很大的问题转化成同样形式但小一些的问题加以解决。用一个求阶乘(n!)的例子来简单说明递归的概念。
#includeint Factorial(int n){ if (n == 0) { return 1; } else { return (n*Factorial(n-1)); }}int main(){ printf("%d\n", Factorial(3));}
n!=n×(n-1)!;n!=1,当n=1时。 由此,我们就可以看到,阶乘的问题可以分解成一个新的,更小的,与原来有相同形式的问题。
同样的,n^k=n×n^(k-1).
int RaiseIntToPower(n,k){ if (k == 0) { return 1; } else { return (n*RaiseIntToPower(n,k-1)); }}
这些问题都满足以下条件:
1)可以找出简单情况,对这些简单简况,答案很容易确定。
2)可以用递归分解把复杂问题分解成相同类型的简答问题;然后应用同一种方案解决这些相对简单的问题。
典型递归函数的函数体都符合以下范例:
if(简单的测试条件)
{
return (不需要递归计算的简单解决方案);
}else
{
return (涉及调用同一函数的递归解决方案);
}
前几天写的permutation也是递归的。 好了,今晚就写到这了,玩点其它的。