前言:
现时咱们对“典型的递归案例”大概比较讲究,小伙伴们都需要学习一些“典型的递归案例”的相关知识。那么小编同时在网络上搜集了一些对于“典型的递归案例””的相关知识,希望朋友们能喜欢,各位老铁们一起来了解一下吧!以下是一个连加的简单实例,分别用递归和循环来实现:
#include <stdio.h>int recur(int n){ if(n==1) return 1; return n+recur(n-1);}int loop(int n){ int sum=0; while(n>0) sum+=n--; return sum;}int main(){ printf("%d\n",recur(10)); // 55 printf("%d\n",loop(10)); // 55 getchar(); return 0;}
递归是如何对应循环的?
递归函数参数往递归终止条件的方向变化,变化表达式为n-1,终止条件为n==1。由此,该函数会被调用9次,函数参数、返回地址等数据会被保存在栈,函数代码会被保存在代码区,相当于代码会被重复9次,函数返回值会被保存在寄存器中,返回时传递给返回函数。
在循环中,同样对应一个条件表达式以及循环变量的变化,在底层,条件表达式对应一个减法表达式,其结果存储在标志寄存器中,以控制代码序列的跳转,形成循环。
另外,理解递归的关键在于理解函数代码是如何重复调用及回归的?以及代码执行的次序,看下面的实例:
#include <stdio.h>void output(int n){ if(n==0) return; printf("递推 %d\n",n); output(n-1); printf("回归 %d\n",n);}int main(){ output(10); getchar(); return 0;}
执行结果为:
/*递推 10递推 9递推 8递推 7递推 6递推 5递推 4递推 3递推 2递推 1回归 1回归 2回归 3回归 4回归 5回归 6回归 7回归 8回归 9回归 10*/
函数调用了10次,函数体重复了10次,但函数体内的代码执行的顺序在递推和回归阶段的执行部分是不相同的,函数体内以递归函数语句:output(n-1);为基准,此语句前的代码在递推阶段执行,此语句后的代码在回归阶段执行。递推时参数和局部变量压栈,回归时参数和局部变量从栈弹出。
上述实例在递归函数语句:output(n-1);后如果没有其它代码,直接结束,称为尾递归,较容易通过循环去实现。
-End-
标签: #典型的递归案例