귀속과 비귀속 모음집

5011 단어 귀속
비귀속은 바로 우리가 속칭하는 순환이다. 비귀속 코드는 매우 길 수 있지만 원가가 낮다(운행시간 등을 포함) 귀속은 바로 속칭 자신이 자신을 호출하는 것이다. 코드는 짧을 수도 있지만 원가가 높으면 두 가지 장점과 단점이 있고 대부분은 서로 전환할 수 있다. 그러나 일부 상황은 하나의 불가예제가 아니라 다음과 같다.
1. 귀환과 비귀환은 각각 n번째 피보나 계수를 구한다
#include
int fib1(int n)//   
{
    int i;
    int f1 = 1;
    int f2 = 1;
    int f3 = 0;
    for (i = 2; i < n; i++)
    {
    //    
        f3 = f1 + f2;
        f1 = f2;
        f2 = f3;
    }
    return f3;
}
int fib2(n)//  
{
    if (n <= 2)
    {
        return 1;
    }
    else
    {
        return fib2(n - 1) + fib2(n - 2);
    }
}
int main()
{
    int n=0;
    int ret1;
    int ret2;
    scanf("%d",&n);
    ret1 = fib1(n);
    printf("   =%d
",ret1); ret2 = fib2(n); printf(" =%d
",ret2); return 0; }

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

int fac(int n,int k)//  
{
    if (0 == k)
        return 1;
    else if (1 == k)
        return n;
    else if (k > 1)
        return n*fac(n, k - 1);
    else
        return -1;
}
int main()
{
    int n, k;
    int ret;
    printf("              :");
    scanf("%d%d",&n,&k);
    if (-1 == ret)
        printf("    !
"); else ret = fac(n, k); printf("%d",ret); return 0; }

3.. 귀속 함수인 DigitSum(n)을 쓰고 마이너스 정수를 입력하여 그 숫자의 합을 되돌려줍니다. 예를 들어 DigitSum(1729)을 호출하면 1 + 7 + 2 + 9를 되돌려야 합니다. 그 합은 19입니다.
#include
int DigitSum(int n)
{
    if (n < 10)
    {
        return n;
    }
    else
    {
        return DigitSum(n / 10) + n % 10;
    }
}
int main()
{
    int n,i=0;
    printf("         :
"); scanf("%d",&n); int ret = DigitSum(n); printf("%d",ret); return 0; }

4. 귀환과 비귀환은 각각strlen을 실현한다
#include

int MyStrlen1(char arr[])//   //*str
{
    int i=0;
    while (arr[i]!=0)
    {
        i++;
    }
    return i;
}
int MyStrlen2(char arr[])//  
{
    int i = 0;
    if (arr[i] != 0)//*str !='\0'
        return 1 + MyStrlen2(arr+1);
    else
        return 0;
}
int main()
{
    char arr[] ="hello world!";//  char *str="hello world!";
    int count1 = MyStrlen1(arr);//(str)
    printf("   =%d
",count1); int count2 = MyStrlen2(arr); printf(" =%d
",count2); return 0; }

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

int Fac1(int n)//   
{
    int i;
    int sum = 1;
    if (0 == n)
        return 1;
    else
    {
        for (i = 1; i <= n; i++)
        {
            sum *= i;
        }
        return sum;
    }
}
int Fac2(int n)//  
{
    if (0 == n)
        return 1;
    else 
        return n*Fac2(n - 1);
}
int main()
{
    int n,ret1;
    printf("          :
"); scanf("%d",&n); if (n < 0)// { printf(" !
"); } else { ret1 = Fac1(n); printf(" =%d
", ret1); int ret2 = Fac2(n); printf(" =%d
", ret2); } return 0; }

6. 정수의 한 자리를 인쇄하는 귀속 방식
#include 

void output(int x)
{
    if (x >= 10)
    {
        output(x / 10);  //x=x/10  
    }
    printf("%d ", x % 10);

}
int main()
{
    int a;
    printf("      ");
    scanf("%d", &a);
    output(a);
    return 0;
}

7. 함수 Reverse 작성string(char * string) (귀속과 비귀속 실현) 실현: 매개 변수 문자열의 문자를 역방향으로 배열합니다.
#include
#include

void reverse_string1(char *p)
{
    int len = strlen(p);//     
    char tmp = *p;
    *p = *(p + len - 1);
    *(p + len - 1) = '\0';
    if (strlen(p + 1) > 1)
    {
        reverse_string1(p + 1);
    }
    *(p + len - 1) = tmp;
}
void reverse_string2(char* str)
{
    char *left = str;
    char *right = str + strlen(str) - 1;
    char temp;
    while (left <= right)
    {
        temp = *left;
        *left=*right;
        *right=temp;
        right--;
        left++;
    }
}
int main()
{
    char str[] = "hello world!";
    printf("   =%s
", str); reverse_string1(str); printf(" =%s
", str); reverse_string2(str); printf(" =%s
",str); return 0; }

8. 한노타 문제(귀속)
#include
void move(char pos1, char pos2)//      
{
    printf("%c-->%c
",pos1,pos2); } void Hanoi(int n, char pos1,char pos2,char pos3) { if (n == 1) { move(pos1,pos3);// } else { Hanoi(n - 1, pos1, pos3, pos2); move(pos1,pos3); Hanoi(n-1,pos2,pos1,pos3); } } int main() { int n; printf(" :"); scanf("%d
",&n); Hanoi(n,'A','B','C'); return 0; }

좋은 웹페이지 즐겨찾기