递归的函数 (if顺序需要调整下,return后面括号里的实参也有地方不对)
2014-01-18 16:29
393 查看
递归的函数
Time Limit: 1000MS Memory limit: 65536K
题目描述
给定一个函数 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)。
输出
对于每组测试数据,输出函数的计算结果。
示例输入
1 1 1
2 2 2
示例输出
2
4
/*arr[a][b][c][0]记录f(a,b,c)的值,arr[a][b][c][1]记录f(a,b,c)是否已计算出(0表示没有计算出结果,1表示已得到结果*/
#include <stdio.h>
/*全局变量会自动初始化所有元素为0,其中arr[a][b][c][1]也全为0,表示未计算出f(a,b,c)*/
int arr[21][21][21][2];
int f(int a,int b,int c)
{
if(arr[a][b][c][1]==1)//已算出f(a,b,c)就不再递归,直接返回结果
return arr[a][b][c][0];
if(a<=0||b<= 0||c<=0)
return 1;
else if(a>20||b>20||c>20)
return f(20, 20, 20);
else if(a<b&&b<c)
{
arr[a][b][c][1]=1;
return arr[a][b][c][0]=f(a,b,c-1)+f(a,b-1,c-1)-f(a,b-1,c);
}
else
{
arr[a][b][c][1]=1;
return arr[a][b][c][0]=f(a-1,b,c)+f(a-1,b-1,c)+f(a-1,b,c-1)-f(a-1,b-1,c-1);
}
}
int main()
{
int a,b,c;
while (scanf("%d%d%d",&a,&b,&c))
printf("%d\n",f(a,b,c));
return 0;
}
递归的函数
Time Limit: 1000MS Memory limit: 65536K
题目描述
给定一个函数 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)。
输出
对于每组测试数据,输出函数的计算结果。
示例输入
1 1 1
2 2 2
示例输出
2
4
/*arr[a][b][c][0]记录f(a,b,c)的值,arr[a][b][c][1]记录f(a,b,c)是否已计算出(0表示没有计算出结果,1表示已得到结果*/
#include <stdio.h>
/*全局变量会自动初始化所有元素为0,其中arr[a][b][c][1]也全为0,表示未计算出f(a,b,c)*/
int arr[21][21][21][2];
int f(int a,int b,int c)
{
if(arr[a][b][c][1]==1)//已算出f(a,b,c)就不再递归,直接返回结果
return arr[a][b][c][0];
if(a<=0||b<= 0||c<=0)
return 1;
else if(a>20||b>20||c>20)
return f(20, 20, 20);
else if(a<b&&b<c)
{
arr[a][b][c][1]=1;
return arr[a][b][c][0]=f(a,b,c-1)+f(a,b-1,c-1)-f(a,b-1,c);
}
else
{
arr[a][b][c][1]=1;
return arr[a][b][c][0]=f(a-1,b,c)+f(a-1,b-1,c)+f(a-1,b,c-1)-f(a-1,b-1,c-1);
}
}
int main()
{
int a,b,c;
while (scanf("%d%d%d",&a,&b,&c))
printf("%d\n",f(a,b,c));
return 0;
}
相关文章推荐
- var tensquared=(function(x) {return x*x;}(10)); //这是一个函数表达式 问:为什么花括号后面还有一个(10)的?而且整个句子用()扩起来?这个是什么表
- 写正确函数需要注意的地方:翻转句子中单词的顺序。
- 写正确函数需要注意的地方:链表的逆转,递归与非递归
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- AcceptEx函数特点及需要提防的地方,看完了解更深入了,所以转过来
- 奇怪,有的Python函数或方法调用需要两对括号?
- 写正确函数需要注意的地方:两个非降序链表的并集,1>2>3和2>3>5合并为1>2>3>5。
- 写正确函数需要注意的地方:给定一个十进制整数N,计算从1开始到N的所有整数出现的“1”的个数
- ifstream 作为函数参数 需要加&
- 调整数组 使得数组中负数排在前面正数排在后面,并且正数和负数的相对位置不变 (递归思路)
- 12.输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 默认实参需要注意的几个地方
- 写正确函数需要注意的地方:strstr
- (用指针方法处理)有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。编写一个函数实现上述功能,在主函数中输入n个整数,并输出调整后的n个数
- IntelliJ:补全if,do-while,try-catch,return句子的括号
- 你不知道java问题if后面加不加括号的问题
- javascript form onsubmit中的return 后面跟一个函数,其中return 起什么作用
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 写正确函数需要注意的地方:奇偶数分开,左边偶数,右边奇数。
- C和指针之函数之归以字符形式按顺序打印数字的每位数字(递归和非递归)