递归专练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;}以上:注意递归的优化放超时防溢出!
阅读全文
0 0
- 递归专练A 递归的函数
- 求a中最大值的递归函数
- 递归专练B 数值分解(伪递归)
- 递归专练D 汉诺塔系列(规律+递归)
- 递归专练C 经典汉诺塔问题
- 递归的函数 --- 递归的记忆化
- 递归函数的理解
- 递归函数的学习
- 函数的递归调用
- 函数的递归
- 递归函数的原理
- 递归函数的应用
- 递归函数的应用
- 递归函数的应用
- 函数的递归
- 函数的递归调用
- 函数的递归好比...
- 递归的函数
- 函数
- 解决maven开发模式下dubbo服务治理的jar包版本过低
- 写在技术博客访问量突破200万之际……
- 习惯:比较字符串内容是否相等,用equals方法
- 3-2 构造函数的调用
- 递归专练A 递归的函数
- Java面向对象
- Bootstrap CSS 概览
- roscore 运行错误
- 素数求和问题
- 关于聊天室输入密码时不显示打印*的代码问题
- matplotlib
- 前端工程师
- 队列