lisp语言

漫谈递归和迭代

亡梦爱人 提交于 2019-12-01 04:59:06
先讲个故事吧。 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”。 这个故事永远也讲不完,因为没有递归结束条件。老师讲递归时总是说,递归很简单,一个递归结束条件,一个自己调用自己。如果递归没有结束条件,那么就会无限递归下去。在编程的时候,没有递归结束条件或者递归过深,一般会造成栈溢出。 下面这个函数,可以利用栈溢出来估测栈的大小: 1 void stack_size() 2 { 3 static int call_time = 0; 4 char dummy[1024*1024]; 5 call_time++; 6 printf("call time: %d\n",call_time); 7 stack_size(); 8 } 递归算法一般用于解决三类问题:这个函数定义了1M的局部变量,然后调用自己。栈溢出时会崩溃,根据最后打印出的数字可以算一下栈的大小。 (1)数据的定义是按递归定义的。(Fibonacci函数) (2)问题解法按递归算法实现。(回溯) (3)数据的结构形式是按递归定义的。(树的遍历,图的搜索) 对于求1+2+3+…+n这种问题,大部分人不会用递归方式求解: 1 2 3 4