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) ;
}