C/PTA —— 11.函数2(课外实践)  一.函数题 6-1 计算A[n]=1/(1 + A[n-1]) 6-2 递归实现顺序输出整数 6-3 自然数的位数(递归版) 6-4 分治法求解金块问题 6-5 汉诺塔 6-6 重复显示字符(递归版) 6-7 显示平行四边形(右)(递归版)   二.编程题     
  
 
一.函数题   
6-1 计算A[n]=1/(1 + A[n-1])   
 
float  fun ( int  n) 
{ if  ( n ==  1 ) return  1 ; return  1  /  ( 1  +  fun ( n -  1 ) ) ; 
} 
  
6-2 递归实现顺序输出整数   
 
void  printdigits ( int  n) 
{ int  count =  0 ; int  num1 =  0 ; num1 =  n; if  ( n ==  0 ) { printf ( "0" ) ; return  0 ; } while  ( n) { n /=  10 ; count++ ; } int  num[ 100 ]  =  {  0  } ; n =  num1; int  count1 =  0 ; while  ( n) { num[ count1++ ]  =  n %  10 ; n /=  10 ; } for  ( int  i =  count1 -  1 ;  i >=  0 ;  i-- ) { printf ( "%d\n" ,  num[ i] ) ; } 
} 
  
6-3 自然数的位数(递归版)   
 
int  NumDigit ( int  number) 
{ if  ( number ==  0 ) return  0 ; else  if  ( number /  10  ==  0 ) return  1 ; else return  NumDigit ( number /  10 )  +  1 ; 
} 
  
6-4 分治法求解金块问题   
 
int  max ( int  a[ ] ,  int  m,  int  n)  { int  i; int  max =  a[ 0 ] ; for  ( i =  m;  i <  n +  1 ;  i++ )  { if  ( a[ i]  >  max)  { max =  a[ i] ; } } return  max; 
} int  min ( int  a[ ] ,  int  m,  int  n)  { int  i; int  min =  a[ 0 ] ; for  ( i =  m;  i <  n +  1 ;  i++ )  { if  ( a[ i]  <  min)  { min =  a[ i] ; } } return  min; 
} 
  
6-5 汉诺塔   
 
void  hanoi ( int  n,  char  from,  char  to,  char  by) 
{ void  move ( char  x,  char  y) ; if  ( n ==  1 ) move ( from,  to) ; else { hanoi ( n -  1 ,  from,  by,  to) ; move ( from,  to) ; hanoi ( n -  1 ,  by,  to,  from) ; } 
} void  move ( char  x,  char  y) 
{ printf ( "%c->%c\n" , x, y) ; 
} 
  
6-6 重复显示字符(递归版)   
 
void  Show ( int  number,  char  symbol) 
{ void  Print ( char  ch) ; if  ( number <=  0 ) return ; if  ( number ==  1 ) Print ( symbol) ; else { Show ( number -  1 ,  symbol) ; Print ( symbol) ; } 
} void  Print ( char  ch) 
{ printf ( "%c" ,  ch) ; 
} 
  
6-7 显示平行四边形(右)(递归版)   
 
void  RtPara ( int  width,  int  height,  char  symbol) 
{ void  PrintSpace ( int  number) ; if  ( width <=  0  ||  height <=  0 ) return ; else { PrintSpace ( height -  1 ) ; Show ( width,  symbol) ; putchar ( '\n' ) ; RtPara ( width,  height -  1 ,  symbol) ; } 
} void  PrintSpace ( int  number) 
{ if  ( number <=  0 ) return ; else { printf ( " " ) ; PrintSpace ( number -  1 ) ; } 
} 
  
二.编程题   
7-2 N阶楼梯上楼问题   
 
int  ClimbStairs ( int  number) 
{ if  ( number ==  1 ) return  1 ; else  if  ( number ==  2 ) return  2 ; else { int  dp[ number+ 1 ] ; dp[ 1 ]  =  1 ; dp[ 2 ]  =  2 ; int  i =  0 ; for  ( i =  3 ;  i <=  number;  i++ ) { dp[ i]  =  dp[ i -  1 ]  +  dp[ i -  2 ] ; } return  dp[ number] ; } 
} int  main ( ) 
{ int  n =  0 ; int  ways =  0 ; scanf ( "%d" ,  & n) ; ways =  ClimbStairs ( n) ; printf ( "%d\n" ,  ways) ; 
}