재귀함수 문제
1. 횟수를 입력받은 다음, 입력받은 횟수만큼 "hello" 문자열을 출력하는 재귀함수를 만드세요.
[입력]
횟수 : 4
[출력]
결과 : hello hello hello hello
2. 대문자 A에서 Z까지 출력하는 재귀함수를 만드세요.
그리고 Z에서 A까지 거꾸로 출력하는 재귀함수도 만드세요.
[입력]
없음
[출력]
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
3. 문자열을 출력하는 재귀함수를 만드세요.
이때 문자열은 scanf 함수로 입력받도록 합니다.
[입력]
문자열 : This_is_a_recursive_call.
[출력]
결과 : This_is_a_recursive_call.
4. 범위를 표현하는 구조체가 있습니다.
struct RANGE
{
int from, to;
};
RANGE 구조체에 입력한 범위 안에 포함된 모든 정수를 더하는 재귀함수를 만듭니다.
from과 to 멤버 또한 범위에 포함되는 것으로 처리합니다.
[입력]
범위 : 5 11
[출력]
합계 : 56
5. 크기가 15인 int 배열을 선언하고, 0부터 11 사이의 난수로 채웁니다.
그리고 배열 내의 위치를 가리키는 정수를 입력받아서,
자신을 포함한 인접한 한 자리 정수들을 모두 -1로 바꾸는 재귀함수를 만듭니다.
[입력]
위치 : 7
[출력]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
=============================================
3 5 8 10 5 2 0 0 8 3 11 9 1 8 0
3 5 8 10 -1 -1 -1 -1 -1 -1 11 9 1 8 0
재귀함수 문제
1. 횟수를 입력받은 다음, 입력받은 횟수만큼 "hello" 문자열을 출력하는 재귀함수를 만드세요.
[입력]
횟수 : 4
[출력]
결과 : hello hello hello hello
답: Qt
void printHello(int n)
{
if( n == 0)
return ;
else
{
qDebug("hello" );
printHello(n-1);
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
printHello(4);
return a.exec();
}
void main()
{
int count;
printf( "횟수 : " );
scanf( "%d", &count );
printf( "결과 : " ); PrintHello( count );
printf( "\n" );
}
void PrintHello( int count )
{
if( count > 0 )// 리턴 조건을 다름
{
printf( "hello " );
PrintHello( count-1 );
}
}
2. 대문자 A에서 Z까지 출력하는 재귀함수를 만드세요.
그리고 Z에서 A까지 거꾸로 출력하는 재귀함수도 만드세요.
[입력]
없음
[출력]
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
void printAlfabet(int n)
{
if( n < 65 || n > 90)
return ;
else
{
qDebug("%c", n);
printHello(n+1);
}
}
int main(int argc, char *argv[]){
QApplication a(argc, argv);
printAlfabet(65);
return a.exec();
}
역으로 출력하는 것은 초기값을 -1 시키면 된다.
void PrintUpper( char ch );
void PrintUpperRev( char ch );
void main()
{
PrintUpper( 'A' ); printf( "\n" );
PrintUpperRev( 'A' ); printf( "\n" );
}
void PrintUpper( char ch )
{
if( ch > 'Z' )
return;
printf( "%c ", ch );
PrintUpper( (char) (ch+1) );
}
void PrintUpperRev( char ch )
{
if( ch > 'Z' )
return;
PrintUpperRev( (char) (ch+1) );
printf( "%c ", ch );
}
3. 문자열을 출력하는 재귀함수를 만드세요.
이때 문자열은 scanf 함수로 입력받도록 합니다.
[입력]
문자열 : This_is_a_recursive_call.
[출력]
결과 : This_is_a_recursive_call.
void printStr(char* str, int nStart, int nEnd)
{
if(nEnd == nStart)
return
else
{
printf("%c",str[nStart]);
printStr(str, nStart+1, nEnd);
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char str[20];
printf("문자열을 입력하세요. \n");
scanf("%s", str);
int len = strlen(str);
printStr(str, 0, len);
return a.exec();
}
#include <stdio.h>
void PrintString( char* str );
void main()
{
char str[256];
printf( "문자열 : " );
scanf( "%s", str );
printf( "결과 : " ); PrintString( str );
printf( "\n" );
}
void PrintString( char* str )
{
if( *str == '\0' )
return;
putchar( *str );
PrintString( str+1 );
}
4. 범위를 표현하는 구조체가 있습니다.
struct RANGE
{
int from, to;
};
RANGE 구조체에 입력한 범위 안에 포함된 모든 정수를 더하는 재귀함수를 만듭니다.
from과 to 멤버 또한 범위에 포함되는 것으로 처리합니다.
[입력]
범위 : 5 11
[출력]
합계 : 56
typedef struct RANGE
{
int from, to
}R
int printSum(int nStart, int nPlus)
{
if(nPlus == -1)
return 0;
else
{
return nStart + printSum(nStart + 1, nPlus-1);
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
R r
r.from = 5;
r.to = 11;
int nPlus = r.to - r.from
printf("%d", printSum(r.from, nPlus ));
return a.exec();
}
#include <stdio.h>
struct RANGE
{
int from, to;
};
int Summation( int from, int to );
void main()
{
struct RANGE range;
printf( "범위 : " );
scanf( "%d %d", &range.from, &range.to );
printf( "합계 : %d\n", Summation(range.from, range.to) );
}
int Summation( int from, int to )
{
int sum;
if( from > to )
return 0;
sum = from;
sum += Summation( from+1, to );
return sum;
}
5. 크기가 15인 int 배열을 선언하고, 0부터 11 사이의 난수로 채웁니다.
그리고 배열 내의 위치를 가리키는 정수를 입력받아서,
자신을 포함한 인접한 한 자리 정수들을 모두 -1로 바꾸는 재귀함수를 만듭니다.
[입력]
위치 : 7
[출력]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
=============================================
3 5 8 10 5 2 0 0 8 3 11 9 1 8 0
3 5 8 10 -1 -1 -1 -1 -1 -1 11 9 1 8 0
void replaceFunc(int* nStart, int nSearch)
{
int* number = nStart + nSearch
if ( nSearch != 1)
{
if(*number > 9)
{
return;
}
else
{
if( *number < 10 && nSearch == -1 )
{
*number = -1;
replaceFunc(number, -1 );
}
else if( nSearch != -1 )
replaceFunc(number, -1 );
}
replaceFunc(number, 1 );
}
if( nSearch == 1)
{
if(*number > 9)
{
return;
}
else
{
if( *number < 10 && nSearch == 1 )
{
*number = -1;
replaceFunc(number, 1 );
}
else if( nSearch != 1)
replaceFunc(number, 1 );
}
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int nNumber[15];
int start = 1;
for(int i = 0 ; i < 15; i++)
{
nNumber[i] = rand()%11;
printf("%d = %d \n", i,nNumber[i]);
}
replaceFunc(nNumber, 7);// 위치입력
for(int i = 0 ; i < 15; i++)
{
printf("\n%d = %d \n", i,nNumber[i]);
}
return a.exec();
}
#include <stdio.h>
#include <stdlib.h>
void Init( int array[], int size, int max );
void PrintRuler( int size );
void Print( int array[], int size );
void TurnUp( int array[], int size, int pos );
void main()
{
int array[15];
int seed, pos;
printf( "씨앗 : " );
scanf( "%d", &seed ); // 15가 적당
srand( seed );
printf( "위치 : " );
scanf( "%d", &pos );
PrintRuler( 15 );
Init( array, 15, 12 );
Print( array, 15 );
TurnUp( array, 15, pos );
Print( array, 15 );
}
void Init( int array[], int size, int max )
{
int i;
for( i = 0; i < size; i++ )
array[i] = rand() % max;
}
void PrintRuler( int size )
{
int i;
for( i = 0; i < size; i++ )
printf( "%2d ", i );
printf( "\n" );
for( i = 0; i < size; i++ )
printf( "===" );
printf( "\n" );
}
void Print( int array[], int size )
{
int i;
for( i = 0; i < size; i++ )
printf( "%2d ", array[i] );
printf( "\n" );
}
void TurnUp( int array[], int size, int pos )
{
if( pos < 0 || pos >= size )
return;
if( array[pos] < 0 || array[pos] >= 10 )
return;
array[pos] = -1;
TurnUp( array, size, pos-1 );
TurnUp( array, size, pos+1 );
}
void replaceFunc(int* nStart, int nSearch)
{
if( nStart[nSearch] < 0 || nStart[nSearch] >= 10)
return
nStart[nSearch] = -1;
replaceFunc(nStart, nSearch-1 );
replaceFunc(nStart, nSearch+1 );
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int nNumber[15];
int start = 1;
for(int i = 0 ; i < 15; i++)
{
nNumber[i] = rand()%11;
printf("%d = %d \n", i,nNumber[i]);
}
replaceFunc(nNumber, 5);// 위치입력
for(int i = 0 ; i < 15; i++)
{
printf("%d = %d \n", i,nNumber[i]);
}
return a.exec();
}
수정한 코드
void replaceFunc(int* nStart, int nSearch)
{
//int* number = nStart + nSearch;
if(nStart[nSearch] > 9 || nStart[nSearch] < 0)
{
return
}
else
{
if( nStart[nSearch] < 10 )
{
nStart[nSearch] = -1;
replaceFunc(nStart, nSearch-1 );
replaceFunc(nStart, nSearch+1 );
}
}
// if( nSearch == 1)
// {
// if(*number > 9)
// {
// return;
// }
// else
// {
// if( *number < 10 && nSearch == 1 )
// {
// *number = -1;
// replaceFunc(number, 1 );
// }
// else if( nSearch != 1)
// replaceFunc(number, 1 );
// }
// }
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int nNumber[15];
int start = 1;
for(int i = 0 ; i < 15; i++)
{
nNumber[i] = rand()%11;
printf("%d = %d \n", i,nNumber[i]);
}
replaceFunc(nNumber, 6);// 위치입력
for(int i = 0 ; i < 15; i++)
{
printf("\n%d = %d \n", i,nNumber[i]);
}
return a.exec();
}
'Computer Science > 알고리즘' 카테고리의 다른 글
재귀의 이해 (0) | 2017.10.21 |
---|---|
알고리즘의 이해(1) (0) | 2017.10.21 |