免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: pugs
打印 上一主题 下一主题

使用递归求3个数中较大的两个数的平方和 [复制链接]

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
11 [报告]
发表于 2008-12-31 22:26 |只看该作者
只看的懂c版的

论坛徽章:
0
12 [报告]
发表于 2008-12-31 22:30 |只看该作者

回复 #9 yaksavage 的帖子

我那个没有楼上那些好。因为无法利用有 3 个数这个条件。

论坛徽章:
0
13 [报告]
发表于 2008-12-31 22:31 |只看该作者
原帖由 cugb_cat 于 2008-12-31 22:22 发表
汗,这帖把各路财神都招来了


过年嘛,娱乐一下好了。

论坛徽章:
0
14 [报告]
发表于 2008-12-31 22:38 |只看该作者
这个题目是在这里看到的http://blog.csdn.net/g9yuayon/archive/2007/05/16/1611451.aspx

从 Joe Marshall论证编程是艺术的文章上看到的。编程到底是不是艺术已经快变成继编程语言和Emacs vs Vi之后另一Flame War话题。有兴趣的可以去看reddit的讨论。有意思的是一段漂亮的代码,实现SICP上一坨练习题1.3:

实现一个带三个参数的函数。这个函数返回三个参数中最大的两个参数的平方和。
题目用来训练学生对条件分支的理解。常规的解法是(迎合一下各位老大,改成C了):

  1. int sum_square_largest(int x, int y, int z)
  2. {
  3.     if (y > x && z > x) {
  4.         return y * y + z * z;
  5.     }

  6.     if (x > y && z > y) {
  7.         return x * x + z * z;
  8.     }

  9.     if (x > z && y > z) {
  10.         return x * x + y * y;
  11.     }
  12. }
复制代码

但Joe老大给出了一个非常漂亮的解法。简洁直观,巧妙地利用递归大幅简化判断。

  1. int sum_square_largest(int x, int y, int z)
  2. {
  3.     if (x <= y && x <= z) {
  4.         return y * y + z * z;
  5.     }

  6.     return sum_square_largest(y, z, x);
  7. }
复制代码

这段代码符合Joe对判断一件作品是否是艺术的四个标准:
A) 这段代码非人(?)不能写出,富于想象力。
B) 这段代码除了实现既定功能外,具有高度的表现力。
C) 这段代码很美。
D) 这段代码传递的美感和思想超越了它自身。

论坛徽章:
0
15 [报告]
发表于 2008-12-31 22:43 |只看该作者
hrrrr...
>>> def foo(a, b, c):
...     return sum(map(lambda x:x*x, sorted([a, b, c])[-2:]))
...
>>> foo(10, -5, 3)
109

[ 本帖最后由 yaksavage 于 2008-12-31 22:48 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2009-01-22 17:06 |只看该作者
原帖由 pugs 于 2008-12-31 22:38 发表
这段代码符合Joe对判断一件作品是否是艺术的四个标准:
A) 这段代码非人(?)不能写出,富于想象力。
B) 这段代码除了实现既定功能外,具有高度的表现力。
C) 这段代码很美。
D) 这段代码传递的美感和思想超越了它自身。

过奖了。
我是自然而然想到要这么做的。

论坛徽章:
0
17 [报告]
发表于 2009-01-22 22:12 |只看该作者
当没有高阶过程,而且内部定义没有过程的时候,选择什么语言关系不大,关键在于法师们所施的魔法。
(define (sum-of-max x y z)
   (if (and (<= x y) (<= x z))
       (sum-of-square y z)
       (sum-of-max y z x)))

[ 本帖最后由 x2 于 2009-1-23 09:34 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-01-23 09:30 |只看该作者
使用循环求3个数中较大的两个数的平方和
原来递归是一种循环。
int sum_of_max(int x, int y, int z)
{
  int t;
  while(1)
    {
      if(x<=y && x<=z)
        return ((y*y)+(z*z));
      t=x, x=y, y=z, z=x;
    }
}

论坛徽章:
0
19 [报告]
发表于 2009-01-23 10:10 |只看该作者
这种用法还真没用过.  开回眼.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP