递归调用二三事
来源:互联网 发布:两个数字匹配算法 编辑:程序博客网 时间:2024/06/05 09:20
C允许函数调用它自己,这种调用过程称之为递归。
递归方案简单,却没有循环效率高。
举个例子:
#include<stdio.h>
void up_and_down(int);
int main(void)
{
up_and_down(1);
return 0;
}
void up_and_down(int n)
{
printf("Level %d: n location %p\n",n,&n);
if(n<4)
up_and_down(n + 1);
printf("Level %d: n location %p\n",n,&n);
}
运行结果如下:
注意,每级递归变量n都属于本级递归私有。
说明几点:
1.每级函数调用都有自己的变量。所以程序创建了4个单独的变量,每个变量名都是n,但他们值都不相同。
2.每次函数都会调用一次。当函数执行完毕后,控制权将被传回上一级递归。
3.递归函数中位于递归调用前的语句,均按被调用函数的顺序执行。
4.递归函数中位于递归调用后的语句,均按被调函数相反顺序执行。
5.虽然每级递归都有自己的变量,但是并没有拷贝代码。程序按照顺序执行函数中的代码,而递归调用就相当于又从头开始执行函数代码。除了每次递归调用创建的变量以外,递归调用非常类似于一个循环语句。
尾递归
最简单的递归形式是把递归调用置于函数的末尾,因为他相当于循环。
//使用递归算阶乘
long rfact(int n)
{
long ans;
if ( n > 0)
ans = n * rfact ( n - 1 );
else
ans = 1;
return ans;
}
递归在处理倒序时非常方便
void to_binary(unsigned long n)
{
int r;
r = n%2;
if( n >= 2)
to_binary(n/2);
putchar(r == 0?'0':'1');
return;
}
这就很轻松地解决了将十进制转二进制的问题。
- 递归调用二三事
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 递归调用
- 动态代理和静态代理到底有什么区别,好处在哪里?
- Filter的一个测试
- 自定义右键菜单
- 蓝桥杯之奇怪的数列
- 使用Matlab+Simulink开发Cortex-M系列嵌入式处理器应用程序
- 递归调用二三事
- java 运算优先级
- NYOJ 无主之地1
- 水平触发和边缘触发的区别
- 如何在微信公众号实现实验室预约
- 杭电2102 A计划 BFS 搜索
- 【干货合集】Docker快速入门与进阶
- 详解栈区、堆区、全局区、文字常量区、程序代码区
- BZOJ 1497: [NOI2006]最大获利 最大闭合权