C 언어는 귀속에 관한 몇 가지 기초 문제와 사고방식

18595 단어

1. 귀환과 비귀환은 각각 n번째 피보나 계수를 구한다.


사고방식: 피보나치수는 1, 1, 2, 3, 5, 8... 뒤의 수는 앞의 두 수를 더하고 첫 번째 수와 두 번째 수는 1이다.돌아가는 사고방식은 매우 간단하다. 들어오는 값이 2보다 작으면 1로 돌아가면 된다.전송된 값이 2보다 크면 본 함수를 다시 호출하여 그의 앞수와 앞수를 구한다.코드는 다음과 같습니다.
int fib1(int n)// 
{
   if (n > 2)
   {
   	return fib1(n - 2) + fib1(n - 1);
   }
   else
   {
   	return 1;
   }
}

귀속되지 않는 방법: 값을 이용하여 저장을 변환하고 낮은 위치에서 높은 위치로 구하며 전입 값으로 순환 횟수를 얻는다. 코드는 다음과 같다.
int fib2(int n)// 
{
	if (n < 3)
	{
		return 1;
	}
	else
	{
		int a = 1;
		int b = 1;
		int sum = 0;
		for (int i = 3; i <= n; i++)
		{
			sum = a + b;
			a = b;
			b = sum;
		}
		return sum;
	}
}

귀환의 단점, 예를 들어 비교적 큰 수를 입력하면 귀환 횟수가 너무 많아 프로그램이 붕괴될 수 있다.

2. 함수를 작성하여 n^k를 실현하고 귀속 실현을 사용


사고방식: 귀착의 종점은 바로 k=1일 때 n으로 돌아가는 것이다.0이 되면 1도 반환됩니다.기타 시 n* 귀속 함수 (n,k-1) 코드는 다음과 같습니다
int fun(int n, int k)
{
	if (k == 0)
	{
		return 1;
	}
	else if (k == 1)
	{
		return n;
	}
	else
	{
		return n*fun(n, k - 1);
	}
}

3. 반복 함수인 DigitSum(n)을 쓰고 음수가 아닌 정수를 입력하여 구성된 숫자의 합을 반환합니다.


예를 들어DigitSum(1729)을 호출하면 1 + 7 + 2 + 9로 돌아가야 한다. 그의 합은 19 사고방식이다. 귀속 종지 조건이 무엇인지 판단하고 값이 있을 때 한 자릿수가 있으면 그의 값을 직접 되돌릴 수 있다.어떻게 종료 조건으로 축소합니까? 매번 호출할 때마다 10을 나누면 현재 위치를 제거할 수 있습니다.코드는 다음과 같습니다.
int DigitSum(int n)
{
	int sum = 0;
	if (n < 10)
		return n;
	else
		sum = n % 10;//sum 
	n = n / 10;
	sum = sum + DigitSum(n);
	return sum;
}

4. 함수 Reverse 작성string(char * string)(반복 실행)


실현: 매개 변수 문자열의 문자를 반대로 배열합니다.요구사항: C 함수 라이브러리의 문자열을 사용하여 함수를 조작할 수 없습니다.사고: 귀속 종지 조건은 인용 바늘이'\0'일 때 되돌아오는 것이다.매번 마지막 값을 첫 번째 값에 부여한 다음 마지막 값을'\0'으로 설정하여 범위를 좁힌다.코드는 다음과 같습니다.
char* inverse_buy(char* string)
{
	assert(string);// string , 
	if (*string == '\0')
	{
		return;
	}
	else
	{
		int len = strlen(string);
		char temp = string[0];
		string[0] = string[len - 1];
		string[len - 1] = '\0';// 
		inverse_buy(string + 1);
		string[len - 1] = temp;// , 
	}
}

5. 귀환과 비귀환은 각각strlen을 실현한다


비귀속 사고방식:while 순환으로 현재 인용된 값을 판단할 때마다'\0'이고 순환체 내부에 계수기 i를 증가하면 순환이 끝나면 현재 i값을 되돌려줍니다.코드는 다음과 같습니다.
int my_strlen1(const char* string)
{
	assert(string);// string , 
	int i = 0;// 
	while (*(string+i))
	{
		i++;
	}
	return i;
}

귀속 사고방식: 귀속 종지 조건, 현재 인용이'\0'이 되면 종지 조건을 판단한다.매번 일련을 추가한 후 돌아가는 바늘의 다음 위치에서 종료 조건까지.코드는 다음과 같습니다.
int my_strlen2(const char*string)
{
	assert(string);
	
	if (*string == '\0')
	{
		return 0;
	}
	else
	{
		return my_strlen2(string+1) + 1;
	}

6.귀환과 비귀환은 각각 n의 곱셈을 실현한다


귀환 사고방식: 귀환 중지 조건은 첫 번째 수나 두 번째 수일 때 1을 되돌려 매번 현재 값 n으로 곱하기(n-1)!코드는 다음과 같습니다.
int factorial(int n)
{
	if (n == 1||n==0)
		return 1;
	else
	return n*factorial(n - 1);
}

비귀속 사고방식: 순환을 이용하여 매번 현재 값을 곱할 때마다 1의 값을 줄이고 코드는 다음과 같다.
int factorial2(int n)
{
	int i = 0;
	int sum = 0;
	if (n == 1 || n == 0)
		return 1;
	for (i = n-1; i > 1; i--)
	{
		n= n*i;
	}
	return n;
}

7. 하나의 정수를 인쇄하는 모든 것을 귀속 방식으로 실현한다


사고방식: 종지 조건은 전송된 N값이 10보다 적을 때 현재 값을 직접 인쇄하고 인쇄할 때마다 현재 최저 위치를 인쇄하며 매번 귀속 조건은 현재 값을 10으로 나누면 귀속 범위를 줄일 수 있다.코드는 다음과 같습니다.
void my_print(int n)
{
	if (n >10)
	{
		printf("%d
"
, n % 10); my_print(n / 10); } else { printf("%d
"
, n); } }

좋은 웹페이지 즐겨찾기