经典递归问题2

版权声明:转载请注明出处 https://blog.csdn.net/Hanoi_ahoj/article/details/83417397
  1. 字符串反转
// 反转串
// 例如:abc  ->  cba

#include <stdio.h>
#include <string.h>

void ReverseString(char *p)
{
    int length = strlen(p);
    if(length <= 1)
    {
        return;
    }
    else
    {
        char tmp = p[0];
        p[0] = p[length-1];
        p[length-1] = '\0';
        ReverseString(p+1);
        p[length-1] = tmp;
    }
}

int main()
{
	char p[] = "abcd";
    ReverseString(p);
    printf("%s\n", p);
	return 0;
}
  1. 组合问题
// 组合问题
// 3个A 2个B可以组成多少 种 排列
// 如:AAABB AABBA等

#include <stdio.h>

// m个A n个B
int f(int m, int n)
{
    if(m == 0 || n == 0)
    {
        return 1;
    }
    // 假设首位置为A,则剩下m-1个A和n个B的组合问题 + 首位置为B...
    return f(m-1, n) + f(m, n-1);
}

int main()
{
    printf("%d\n", f(3, 1));
    return 0;
}

  1. 杨辉三角
// 杨辉三角
// 计算第m层第n个元素

/*
 1
 1 1
 1 2 1
 1 3 3 1
 1 4 6 4 1
 1 5 10 10 5 1
 */

#include <stdio.h>

int f(int m, int n)
{
    if(n == 0)
    {
        return 1;
    }
    if(m == n)
    {
        return 1;
    }
    return f(m-1, n) + f(m-1, n-1);
}

int main()
{
    int leval = 5;  // 第5行 0-5共6个元素
    for(int i=0; i<=leval; i++)
    {
        printf("%d ", f(leval, i));
    }
    printf("\n");
    return 0;
}

  1. 整数划分问题
// 整数划分问题
// n = 6
/*
 6
 5+1
 4+2,4+1+1
 3+3,3+2+1,3+1+1+1
 2+2+2,2+2+1+1,2+1+1+1+1
 1+1+1+1+1+1
 */

#include <stdio.h>

#define MAXSIZE 1024

// arr->缓冲,cur->当前位置
void f(int n, int arr[], int cur)
{
    if(n<=0)
    {
        for(int i=0; i<cur; i++)
        {
            printf("%d ", arr[i]);
        }
        printf("\n");
        return;
    }
    
    for(int i=n; i>0; i--)
    {
        if(cur>0 && i>arr[cur-1])
        {
            continue;
        }
        arr[cur] = i;
        f(n-i, arr, cur+1);
    }
}

int main()
{
    int arr[MAXSIZE] = {0};
    f(6, arr, 0);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Hanoi_ahoj/article/details/83417397
今日推荐