经典递归问题1

版权声明:转载请注明出处 https://blog.csdn.net/Hanoi_ahoj/article/details/83351260
  1. 在n个球中,任意取m个(不放回),求有多少种取法

#include <stdio.h>

int f(int n, int m)
{
    if (n<m)    // 3个球取4个出来 显然是0种取法
    {
        return 0;
    }
    if (m==0)   // 3个球取0个出来 有1种取法
    {
        return 1;
    }
    if (n==m)   // 3个球取3个出来 有1种取法
    {
        return 1;
    }
    return f(n-1, m-1) + f(n-1, m);
}

int main(int argc, const char * argv[])
{
    int k = f(5, 3);
    printf("%d\n", k);
    
    return 0;
}
  1. 求n个元素的全排列

// abc acb bac bca cab cba
#include <stdio.h>

void f(char data[], int length, int cur)
{
	if(cur==length)
		printf("%s\n", data);
	for(int i=cur; i<length; i++)
	{
		{	// 试探
			char tmp = data[i];
			data[i] = data[cur];
			data[cur] = tmp;
		}

		f(data, length, cur+1);

		{	// 回溯
			char tmp = data[i];
			data[i] = data[cur];
			data[cur] = tmp;
		}
	}
}

int main()
{
	char data[] = "abcd";
	int length = sizeof(data)/sizeof(data[0]) - 1;
	//printf("%d\n",length);
	f(data, length, 0);
	return 0;
}
  1. 两个串的最大公共子序列的长度

// 可解!

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

int MAX(int a, int b)
{
    return a>b?a:b;
}

int f(char *s1, char *s2)
{
    if (strlen(s1)*strlen(s2) == 0)
    {
        return 0;
    }
    if (s1[0] == s2[0])
    {
        return f(s1+1, s2+1) + 1;
    }
    else
    {
        return MAX(f(s1+1, s2), f(s1, s2+1));
    }
}

int main(int argc, const char * argv[])
{
    char *s1 = "abc";
    char *s2 = "xbacd";
    
    int ret = f(s1, s2);
    printf("%d\n", ret);
    
    return 0;
}

猜你喜欢

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