Email qiaolincic tsinghua edu cn Tel 62792961 http

  • Slides: 34
Download presentation
计 算 机 程 序 设 计 基 础 Email: qiaolin@cic. tsinghua. edu. cn

计 算 机 程 序 设 计 基 础 Email: qiaolin@cic. tsinghua. edu. cn Tel: 62792961 乔 林 计算机程序设计基础 清华大学计算中心 http: //learn. tsinghua. edu. cn 1

计 算 机 程 序 设 计 基 础 递归函数示例一 • 阶乘的计算 long int

计 算 机 程 序 设 计 基 础 递归函数示例一 • 阶乘的计算 long int Cal. Factorial( int n ){ long int result = 1; int i = 0; while( ++i <= n ) result *= i; return result; } long int Cal. Factorial( int n ){ long int result; if( n == 0 || n == 1 ) result = 1; else result = n * Cal. Factorial( n – 1 ); return result; } 清华大学计算中心 http: //learn. tsinghua. edu. cn 4

计 算 机 程 序 设 计 基 础 递归函数示例二 • 幂的计算 long double

计 算 机 程 序 设 计 基 础 递归函数示例二 • 幂的计算 long double Cal. Power( long double x, int n ) { long double result; if( n == 0 ) result = 1; else result = x * Cal. Power( x, n – 1 ); return result; } 清华大学计算中心 http: //learn. tsinghua. edu. cn 5

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 阶乘的计算 #include <stdio.

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 阶乘的计算 #include <stdio. h> long int Cal. Factorial( int n ){ long int result; if( n == 0 || n = 1 ) result = 1; else result = n * Cal. Factorial( n – 1 ); return result; } void main(){ int num = 3; long int fac; fac = Cal. Factorial( num ); printf( “%ld”, fac ); } 清华大学计算中心 http: //learn. tsinghua. edu. cn 7

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 第一次调用 Cal. Factorial()

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 第一次调用 Cal. Factorial() 函数栈框架 long int Cal. Factorial( int n ){ long int result; if( n == 0 || n = 1 ) result = 1; else result = n * Cal. Factorial( n – 1 ); return result; } 清华大学计算中心 http: //learn. tsinghua. edu. cn 9

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 第二次调用 Cal. Factorial()

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 第二次调用 Cal. Factorial() 函数栈框架 long int Cal. Factorial( int n ){ long int result; if( n == 0 || n = 1 ) result = 1; else result = n * Cal. Factorial( n – 1 ); return result; } 清华大学计算中心 http: //learn. tsinghua. edu. cn 10

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 第三次调用 Cal. Factorial()

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 第三次调用 Cal. Factorial() 执行后栈框架 long int Cal. Factorial( int n ){ long int result; if( n == 0 || n = 1 ) result = 1; else result = n * Cal. Factorial( n – 1 ); return result; } 清华大学计算中心 http: //learn. tsinghua. edu. cn 11

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 第二次调用 Cal. Factorial()

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 第二次调用 Cal. Factorial() 执行后栈框架 long int Cal. Factorial( int n ){ long int result; if( n == 0 || n = 1 ) result = 1; else result = n * Cal. Factorial( n – 1 ); return result; } 清华大学计算中心 http: //learn. tsinghua. edu. cn 12

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 第一次调用 Cal. Factorial()

计 算 机 程 序 设 计 基 础 递归过程的跟踪 • 第一次调用 Cal. Factorial() 执行后栈框架 long int Cal. Factorial( int n ){ long int result; if( n == 0 || n = 1 ) result = 1; else result = n * Cal. Factorial( n – 1 ); return result; } 清华大学计算中心 http: //learn. tsinghua. edu. cn 13

计 算 机 程 序 设 计 基 础 Hanoi 塔问题 • 递归算法的伪代码 void

计 算 机 程 序 设 计 基 础 Hanoi 塔问题 • 递归算法的伪代码 void Move. Hanoi. Tower( int num, char source, char temp, char dest ) { if( n == 1 ) 将一个圆盘从 source 移动到 dest else { 将 n – 1 个圆盘从 source 移动到 temp 将圆盘 n 从 source 移动到 dest 将 n – 1 个圆盘从 temp 移动到 dest } } 清华大学计算中心 http: //learn. tsinghua. edu. cn 18

计 算 机 程 序 设 计 基 础 Hanoi 塔问题 • 递归算法 void

计 算 机 程 序 设 计 基 础 Hanoi 塔问题 • 递归算法 void move( char source, char dest ){ printf( “%c->%c”, source, dest ); } void Move. Hanoi. Tower( int num, char source, char temp, char dest ){ if( num == 1 ){ move( source, dest ); } else{ Move. Hanoi. Tower( num – 1, source, dest, temp ); move( source, dest ); Move. Hanoi. Tower( num – 1, temp, source, dest ); } } 清华大学计算中心 http: //learn. tsinghua. edu. cn 19

计 算 机 程 序 设 计 基 础 分形问题 • 算法初步实现 void Draw.

计 算 机 程 序 设 计 基 础 分形问题 • 算法初步实现 void Draw. Fractal( double length, double scale, double alpha, double delta, double cx, double cy, int order ) { if( order == 0 ) { 画树干,当前点 (cx, cy),长度为length,水平夹角 alpha } else { 画树干,当前点 (cx, cy),长度 length,水平夹角alpha 计算新的线段顶点坐标 (cx, cy) 画右分枝,新顶点 (cx, cy),长度 length * scale,水平夹角 alpha – delta 画左分枝,新顶点 (cx, cy),长度 length * scale,水平夹角 alpha + delta } } 清华大学计算中心 http: //learn. tsinghua. edu. cn 23

计 算 机 程 序 设 计 基 础 分形问题 • 算法实现 void Draw.

计 算 机 程 序 设 计 基 础 分形问题 • 算法实现 void Draw. Line( double length, double alpha, double cx, double cy ){ double theta; theta = alpha / 180. 0 * PI; moveto( cx, cy ); linerel( length * cos(theta), –length * sin(theta) ); } void Draw. Fractal( double length, double scale, double alpha, double delta, double cx, double cy, int order ){ if( order == 0 ) Draw. Line( length, alpha, cx, cy ); else{ Draw. Line( length, alpha, cx, cy ); cx = cx + length * scale * cos(alpha/180. 0*PI); cy = cy – length * scale * sin(alpha/180. 0*PI); Draw. Fractal( length*scale, alpha–delta, cx, cy, order– 1 ); Draw. Fractal( length*scale, alpha+delta, cx, cy, order– 1 ); } } 清华大学计算中心 http: //learn. tsinghua. edu. cn 24

计 算 机 程 序 设 计 基 础 其他递归问题一 • Pascal 三角形 int

计 算 机 程 序 设 计 基 础 其他递归问题一 • Pascal 三角形 int Pascal. Triangle( int n, int k ) { if( k==0 || k==n ) return 1; else return Pascal. Triangle(n– 1, k– 1) + Pascal. Triangle(n– 1, k); } 清华大学计算中心 http: //learn. tsinghua. edu. cn 25

计 算 机 程 序 设 计 基 础 其他递归问题二 • 折半查找 int Binary.

计 算 机 程 序 设 计 基 础 其他递归问题二 • 折半查找 int Binary. Search( int a[], int key, int low, int high ) { int mid = ( low + high ) / 2; if( low > high ) return – 1; if( key == a[mid] ) return mid; else{ if( key < a[mid] ) return Binary. Search( a, key, low, mid – 1 ); else return Binary. Search( a, key, mid + 1, high ); } } 清华大学计算中心 http: //learn. tsinghua. edu. cn 26

计 算 机 程 序 设 计 基 础 12. 3 递归与迭代 • 递归算法实现

计 算 机 程 序 设 计 基 础 12. 3 递归与迭代 • 递归算法实现 long int Fabonacci( int n ) { if( n == 1 || n == 2 ) return 1; else return Fabonacci( n – 1 ) + Fabonacci( n – 2 ); } 清华大学计算中心 http: //learn. tsinghua. edu. cn 32

计 算 机 程 序 设 计 基 础 12. 3 递归与迭代 • 迭代算法实现

计 算 机 程 序 设 计 基 础 12. 3 递归与迭代 • 迭代算法实现 long int Fabonacci( int n ) { int i, f, f 1 = 1, f 2 = 1; if( n == 1 || n == 2 ) return 1; else for( i = 3; i <= n; i++ ){ f = f 1 + f 2; f 2 = f 1; f 1 = f; } return f; } 清华大学计算中心 http: //learn. tsinghua. edu. cn 33