写出最短的代码
背景:
今天我在学校练习系统里面遇到了一个实验题
1 2 3 4 5 6
| (语言: C)第六章实验题:编写函数计算1-1/3+1/5-1/7+…的值,直至最后一项的绝对值<0.001 提示:输出结果的最后两位是97
输入:无 输出提示:"result=" 输出格式:"
|
代码实现
我非要使用递归调用,这是我第一次写的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <stdio.h> #include <math.h>
float Function() { static int count = 1, i = 1; i = (abs(i) + 2) * pow(-1, count++); if (fabs(1.0 / i) < 1e-3) { return 1.0 / i; } else { return 1.0 / i + Function(); } }
int main(void) { printf("result=%f", 1 + Function()); return 0; }
|
一坨狗屎,但是我觉得写出来还是很有意思的。
这是我第二次写的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <stdio.h>
float Function() { static int i = 1; float current = 1.0 / i; i = i + 2; if (current < 1e-3) { return current; } else { return current - Function(); } }
int main(void) { printf("result=%f", Function()); return 0; }
|
我真他妈是个天才,省略了math.h有文件,利用递归调用的返回值构造加减交替的形式,我觉得很值得全世界的人学习
还能再短一点,这是我第三次写的代码,做了一些小改动:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <stdio.h>
float Function(int i) { if (1.0 / i < 1e-3) { return 1.0 / i; } else { return 1.0 / i - Function(i+2); } }
int main(void) { int i = 1; printf("result=%f", Function(i)); return 0; }
|
我真牛逼。。。。过后我又在想能不能在主函数中实现功能使代码更短?
这是我第四次写代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <stdio.h> #include <math.h>
int main() { float sum = 0,current = 1; while (current >= 1e-3) { static int i = 1; current=1.0/i; i = i + 2; sum = -sum + current; } printf("result=%f", fabs(sum)); return 0; }
|
虽然能实现功能,但是整个代码有点离谱了,都不是人能写出来的!
比如在while循环中定义静态变量,还有最后招笑的fabs函数
我感觉有点没有意思了,于是我问了问哈基米,让他写一个最短的代码:
1 2 3 4 5 6 7
| #include<stdio.h> float f(int i) { return 1. / i < 1e-3 ? 1. / i : 1. / i - f(i + 2); } int main() { printf("result=%f", f(1)); }
|
仅需7行,92字符。还借鉴了我的第二个代码
你哈基米还是牛逼。
总结
我可能是发癫了,花了2个多小时解决这么简单一个问题,但是这很值得!