注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天地不仁,以万物为Googol!

天行有常,不以物喜,不以己悲……

 
 
 

日志

 
 

代码的艺术……  

2007-05-18 23:19:26|  分类: 积累 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
起因是这里:http://blog.csdn.net/g9yuayon/archive/2007/05/16/1611451.aspx

话说,如果让你写一个函数,这个函数输入三个整数,返回其中最大的两个数的平方和,你会怎么写?

最普通的写法:
int func(int a, int b, int c)
{
    if( (a<=b) && (a<=c) )
        return b*b + c*c;
    if( (b<=a) && (b<=c) )
        return a*a + c*c;
    return a*a + b*b;
}

但是,这个地方的大牛给出了令人震惊的答案,反正我写程序这么多年,从没看到有人这样写过:
int func(int a, int b, int c)
{
    if ( (a<=b) && (a<=c) )
        return b*b + c*c;
    return func(b, c, a);
}

居然华丽的用上了递归……

当然,原文是用的schema,一种lisp的变种。这种语言里面没有循环,所有的循环都用递归完成。因此这种用递归完成的思维也就不奇怪了。

由于过程语言里递归的开销太大,消除尾递归的样子是这样:
int func(int a, int b, int c)
{
    int t;
    while(true)
    {
        if ( (a<=b) && (a<=c) )
             return b*b + c*c; 
        t = a; a = b; b = c; c = t;
    }
}

可惜,这样就不那么的华丽和艺术了……

原文里还给出了所谓“艺术的程序”的定义(综合了两位老大的成果,不要管我要版税啊,括号里是我的吐槽):
- It is a product of human skill and imagination.
  这段代码非人不能写出,富于想象力。(这段代码是人写的,而且具有非人类的想象力)
- It is intended to communicate in addition to any other function it may have.
  这段代码除了实现既定功能外,具有高度的表现力。(代码不以功能为目的,而以显摆为目的)
- There is an aesthetic associated with it.
  这段代码很美。(代码很臭美)
- The aesthetics and ideas communicated transcend the particulars of an individual work.
  这段代码传递的美感和思想超越了它自身。(这段代码已经到达了某党的臭美和思想高度)

恩,可见,显摆和臭美很重要……

那我也继续显摆一下。

话说递归时会对传入的三个数的顺序做改变。那么这个改变有什么规则呢?穷举一下看看(幸亏只有三个数……不可行的原因大家自己去想吧):
 顺序逆序数
是否可行
a, b, c
0
原顺序,不可行
a, c, b
1
不可行
b, a, c
1
不可行
b, c, a 2
可行
c, a, b 2
可行
c, b, a
3
不可行

穷举结果,只有逆序数是2的数列变换可以作为递归时的参数顺序,其余都可能使递归陷入死循环。当然,这个2肯定和二进制没关系,要我猜,应该是(3-1)。

验证2=(3-1)(啊……怎么看怎么废话)的方法,把3扩展为4好了,甚至更进一步,用递归方法给出求n个数中最大的m个数的某种操作好了……

我懒了,不显摆了……

ps 晚上做梦,突然想到C里可以华丽的写成这样:
int func(int a, int b, int c)
{
    int t;
    while ( (a>=b) || (a>=c) )
        t=a, a=b, b=c, c=t;
    return b*b + c*c;
}

可惜,int t看上去不那么的艺术,而且,希望我没有记错逗号表达式的求值顺序……

ps2 看到了这个:http://gizmodo.com/gadgets/security%3F-nope/vista-hacked-again-this-time-even-more-effectively-261639.php

不得不感叹,中国人太油菜了!可惜是在不值得为此写一篇blog而让本文沉下去,ps一下好了。
  评论这张
 
阅读(415)| 评论(7)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017