递归一些简单题目

  1. n的阶乘

  1. 输出一个多位数字的每一位

  1. 求字符串的长度

  1. 求斐波那契数列第n项

  1. 汉诺塔

  1. 青蛙跳台阶

  1. 冒泡排序


  1. n的阶乘


int factorial(int n) {//递归
    if (n == 0)
        return 1;
    else 
        return (n * factorial(n - 1));
}
int factorial2(int n) {//非递归
    int nu = 1;
    while (n > 0) {
        nu = nu * n--;
    }
    return nu;
}

int main() {
    //n的阶乘
    int n = 5;
    printf("%d \n", factorial(n));
    printf("%d \n", factorial2(n));
    return 0;
}
  1. 输出一个多位数字的每一位


void print_num(int n) {//递归
    printf("%d\n", n % 10);
    if (n > 9) {
        print_num(n / 10);
    }
}

void print_num2(int n) {//循环
    while (n > 0) {
        printf("%d\n", n % 10);
        n = n / 10;
    }
}

int main() {
    //输出一个多位数字的每一位
    int n = 23445;
    print_num2(n);
    return 0;
}
  1. 求字符串的长度


int sum = 0;
void my_strlen(char* arr) {
    if (*arr != '\0') {
        sum++;
        my_strlen(arr + 1);
    }
}

int main() {//求字符串的长度
    char arr[] = "hello";
    my_strlen(arr);
    printf("%d", sum);
    return 0;
}
  1. 求斐波那契数列第n项


int fb(int n) {
    int fn;
    if (n > 0) {
        if (n == 1 || n == 2)
            return 1;
        else
        {
            fn = fb(n - 1) + fb(n - 2);
            return fn;
        }
    }
    else
        return -1;
}

int main() {//求斐波那契数列第n项
    int n = 0;
    printf("%d\n", fb(n));
    return 0;
}
  1. 汉诺塔


void hanoi(int n, char A, char B, char C) {
    if (n == 1) {
        printf("%c -> %c\n", A, C);
    }
    else
    {
        hanoi(n - 1, A, C, B);
        printf("%c -> %c\n", A, C);
        hanoi(n - 1, B, A, C);
    }
}

int main() {//汉诺塔
    int n = 3;
    char A = 'A';
    char B = 'B';
    char C = 'C';
    hanoi(n, A, B , C);
    return 0;
}
  1. 青蛙跳台阶


int sum = 0;
void frog(int n, int N) {
    if (n < N) {
        frog(n + 1, N);
        frog(n + 2, N);
    }
    if (n == N) {
        sum++;
    }
}

int main() {
    //青蛙跳台阶:青蛙一次可以跳1个台阶,也可以一次跳n的台阶
    int n = 0;
    int N = 3;
    frog(n, N);
    printf("%d\n", sum);
    return 0;
}
  1. 冒泡排序


void pupple(int* arr, int sz) {
    for (int i = 0; i < sz; i++) {
        for (int j = 0; j < sz - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
             }
        }
    }
}

int main() {
    //冒泡排序
    int arr[] = {2, 34, 4, 5, 7, 90, 567, 4, 34};
    int sz = sizeof(arr) / sizeof(arr[0]);
    for (int i = 0; i < sz; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    pupple(arr, sz);
    for (int i = 0; i < sz; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

你可能感兴趣的:(C/C++,算法,数据结构)