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