C语言第七章函数递归

函数递归

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

//函数声明 
void diguifunc();
void qtfunc1();
void qtfunc2();
void qtfunc3();
int dg_jc();
int main(int argc, char *argv[]) {
	
	//函数的递归调用 
	diguifunc();
	
	//调用栈:(一块系统分配给咱们这个程序有特殊用途的内存)把形式参数 函数调用关系 局部变量 
	//这段内存是有限的 一旦超过了这个这个内存大小 就会出现崩溃现象
	
	//因为这种递归调用产生死循环问题 所以这种自己调用自己的方式 必须要有一个出口,这个出口也叫递归结束条件 
	
	//递归调用的出口范例
	//计算5的阶乘:5! 出口肯定是1!
	//dg_jc(5) = dg_jc(4)*5 递归-- 
 	//dg_jc(4) = dg_jc(3)*4  
 	//dg_jc(3) = dg_jc(2)*3
 	//dg_jc(2) = dg_jc(1)*2
 	//dg_jc(1) = 1; 这里是出口条件
 	dg_jc(5);
	//递归优缺点:
	//优点:
	//代码少,代码看起来简洁,精妙 
	//虽然简洁 但是不好理解
	//层次太深的话 调用栈(内存)太深 可能回溢出 出现这种情况下 那么说明不能用递归解决该问题
	
	//有些问题用不用递归都行 
	//有些是必须的://汉诺塔 
	
	//递归的直接或者间接调用:
	//递归函数直接调用:
	//调用递归:函数的f的过程 f函数有调用自己 这就是直接调用
	//间接调用:调用函数f1的过程中要调用f2函数 然后f2函数又要调用f1函数
	
	//
}
//递归函数:就是自己调用自己 
//执行函数将反复的调用自身 每调用自己一次就进入了一个新层 
//必须得有出口:就是递归的结束条件
void diguifunc(){
 	
	printf("This is diguifunction\n"); 
	int a = dg_jc(5); 
 	printf("%d\n",a);
	
}
//范例:
//n! 用递归函数代码 
int dg_jc(int n){
	
	int result;//保存结果 
	if(n == 1){
		return 1; //递归调用的出口 
	}else{
		result =  dg_jc(n-1) * n;
	}
    return result;		
}
//函数定义 
void qtfunc1(){
	int temp = 150; //局部变量:在函数内部定义的变量,当整个函数执行完后,局部变量所占的内存被系统自动回收 
	printf("Q1开始执行\n");
	qtfunc2();
	printf("Q1执行结束\n"); 
}
void qtfunc2(){
	printf("Q2开始执行\n");
	qtfunc3();
	printf("Q2执行结束\n"); 
} 
void qtfunc3(){
	printf("Q3开始执行\n");
	printf("Q3执行结束\n"); 
}
上一篇:数据库迁移的几种方式


下一篇:RAC_单实例_DG 关于两端创建表空间数据文件路径不一致的问题注意点