递归专练A 递归的函数

来源:互联网 发布:js 3d 720度全景展示 编辑:程序博客网 时间:2024/05/29 09:27

题意:

给定一个函数 f(a, b, c):
如果 a ≤ 0 或 b ≤ 0 或 c ≤ 0 返回值为 1;
如果 a > 20 或 b > 20 或 c > 20 返回值为 f(20, 20, 20);
如果 a < b 并且 b < c 返回 f(a, b, c−1) + f(a, b−1, c−1) − f(a, b−1, c);
其它情况返回 f(a−1, b, c) + f(a−1, b−1, c) + f(a−1, b, c−1) − f(a-1, b-1, c-1)。
看起来简单的一个函数?你能做对吗?
输入: 
输入包含多组测试数据,对于每组测试数据:
输入只有一行为 3 个整数a, b, c(a, b, c < 30)。
输出:
对于每组测试数据,输出函数的计算结果。
——————————————————————————————————————————————————————————————————
这个题目打眼一看明显递归,普通递归写完以后严重超时,想到题目要优化。!关键:用数组保存每一步的递归结果,避免重复调用!!
#include <stdio.h>int S[31][31][31];int digui(int n,int k,int l){    if(n<=0||k<=0||l<=0)        return 1;    else if(n>20||k>20||l>20)        return digui(20,20,20);    else if(S[n][k][l])        return S[n][k][l];    else if(n<k&&k<l)    {        S[n][k][l]=digui(n,k,l-1)+digui(n,k-1,l-1)-digui(n,k-1,l);        return S[n][k][l];    }    else    {        S[n][k][l]=digui(n-1,k,l)+digui(n-1,k-1,l)+digui(n-1,k,l-1)-digui(n-1,k-1,l-1);        return S[n][k][l];    }}int main(){    int a,b,c;    memset(S,0,sizeof(S));    while(scanf("%d%d%d",&a,&b,&c)!=EOF)    {            printf("%d\n",digui(a,b,c));    }    return 0;}
以上:注意递归的优化放超时防溢出!