有人可以提供关于递归函数的编程示例吗?除了像斐波那契数列和汉诺塔这样的常见示例之外,还有什么有趣的内容呢?
有人可以提供关于递归函数的编程示例吗?除了像斐波那契数列和汉诺塔这样的常见示例之外,还有什么有趣的内容呢?
这幅插图是英文的,并非实际的编程语言,但对于以非技术方式解释过程很有用:
一个孩子无法入睡,于是她的母亲讲了一个关于一只小青蛙的故事, 小青蛙也无法入睡,于是青蛙的母亲讲了一个关于一只小熊的故事, 小熊也无法入睡,于是熊的母亲讲了一个关于一只小黄鼠狼的故事, ……然后小黄鼠狼就睡着了。 ……然后小熊也睡着了; ……然后小青蛙也睡着了; ……于是孩子也睡着了。
如何测试一个字符串是否为回文?
bool isPalindrome(char* s, int len)
{
if(len < 2)
return TRUE;
else
return s[0] == s[len-1] && isPalindrome(&s[1], len-2);
}
当然,你可以使用循环更有效地完成这个任务。
constexpr bool compileTimeIsPalindrome(const char* s, int len) { return len < 2 ? true : s[0] == s[len-1] && compileTimeIsPalindrome(&s[1], len-2); }
- learnvst来自数学领域的,有阿克曼函数:
Ackermann(m, n)
{
if(m==0)
return n+1;
else if(m>0 && n==0)
return Ackermann(m-1, 1);
else if(m>0 && n>0)
return Ackermann(m-1, Ackermann(m, n-1));
else
throw exception; //not defined for negative m or n
}
这个函数总是会结束,但它即使对于非常小的输入也会产生极其巨大的结果。例如,Ackermann(4, 2)返回的结果是265536 − 3。
public static int countFiles(File f) {
if (f.isFile()){
return 1;
}
// Count children & recurse into subdirs:
int count = 0;
File[] files = f.listFiles();
for (File fileOrDir : files) {
count += countFiles(fileOrDir);
}
return count;
}
File
实例既可以表示普通文件,也可以表示目录。此工具从计数中排除了目录。)FileUtils.deleteDirectory()
;请参阅API文档和源代码。解释器模式是一个很好的例子,因为很多人没有发现递归。维基百科文章中列出的示例代码很好地说明了如何应用它。然而,一个更基本的方法仍然实现了解释器模式,那就是针对嵌套列表的ToString
函数:
class List {
public List(params object[] items) {
foreach (object o in items)
this.Add(o);
}
// Most of the implementation omitted …
public override string ToString() {
var ret = new StringBuilder();
ret.Append("( ");
foreach (object o in this) {
ret.Append(o);
ret.Append(" ");
}
ret.Append(")");
return ret.ToString();
}
}
var lst = new List(1, 2, new List(3, 4), new List(new List(5), 6), 7);
Console.WriteLine(lst);
// yields:
// ( 1 2 ( 3 4 ) ( ( 5 ) 6 ) 7 )
在上面的代码中,如果你期望一个名为 Eval
的函数,那么很难发现解释器模式……但是,实际上,解释器模式并没有告诉我们函数叫什么或者它到底做了什么,而且《设计模式》一书明确将上述内容作为该模式的示例。
fold
,而fold
又可以被解释(双关语)为一个具有仅两个命令element(e)
和NIL
的可参数化解释器,其中列表是程序。很酷,对吧?在这里找到了该解释:Functional Programming for Beginners - Rúnar Óli Bjarnason - Boston Area Scala Enthusiasts。 - Jörg W Mittag在我看来,递归是很好掌握的,但是大多数可以使用递归完成的解决方案也可以使用迭代完成,而且迭代效率更高。
话虽如此,这里有一种递归方式可以在嵌套树(比如ASP.NET或Winforms)中查找控件:
public Control FindControl(Control startControl, string id)
{
if (startControl.Id == id)
return startControl
if (startControl.Children.Count > 0)
{
foreach (Control c in startControl.Children)
{
return FindControl(c, id);
}
}
return null;
}