免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5313 | 回复: 18
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-31 16:56 |只看该作者 |倒序浏览
刚刚在csdn上看到的一道题目,感兴趣的不妨做做,看能否在较短间内完成。

题目:实现一个带三个参数的函数int sum_square(int a, int b, int c)。这个函数返回三个参数中最大的两个参数的平方和。

要求:使用递归算法实现

例子:sum_square(1, 2, 3) == 2 * 2 + 3 * 3 == 13

常规解法:

  1. int square(int x, int y)
  2. {
  3.      return x * x + y * y;
  4. }

  5. int sum_square(int a, int b, int c)
  6. {
  7.      if (a < b && a < c)
  8.            return square(b, c);
  9.      if (b < a && b < c)
  10.            return square(a, c);
  11.      if (c < a && c < b)
  12.            return square(a, b);
  13. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2008-12-31 18:01 |只看该作者
emacs lisp


  1. (defun f (x y z)
  2.   (if (and (<= x y) (<= x z))
  3.       (+ (* y y) (* z z))
  4.     (f y z x)))
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-12-31 19:55 |只看该作者
Erlang:
  1. foo( X, Y, Z ) when X < Y, X < Z -> Y*Y + Z*Z;
  2. foo( X, Y, Z ) -> foo( Y, Z, Z ).
复制代码


Haskell:
  1. foo x y z | x < y, x < z = y*y + z*z
  2. foo x y z = foo y z x
复制代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-12-31 19:59 |只看该作者
既然是int型,是不是要考虑负数呢?

论坛徽章:
0
5 [报告]
发表于 2008-12-31 21:00 |只看该作者
2L、3L都挺厉害的,为啥不用C解答,难道用C掉档次
我土,给个C版本的答案吧:

  1. int square(int x, int y)
  2. {
  3.      return x * x + y * y;
  4. }

  5. int sum_square(int a, int b, int c)
  6. {
  7.      if (a < b && a < c)
  8.            return square(b, c);
  9.      return sum_square(b, c, a);
  10. }
复制代码

[ 本帖最后由 pugs 于 2008-12-31 21:03 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-12-31 21:05 |只看该作者
我也掺和一下, scheme 的,用一个不同思路的递归


  1. (define (f xs)
  2.   (define (g ys y s)
  3.     (if (null? ys) (- s (* y y))
  4.       (let* ((now (car ys))
  5.              (sum (+ s (* now now))))
  6.         (if (< now y) (g (cdr ys) now sum)
  7.             (g (cdr ys) y sum)))))
  8.   (let ((fst (car xs)))
  9.     (g (cdr xs) fst (* fst fst))))
复制代码


累加各数的平方,并减去最小数的平方。

[ 本帖最后由 win_hate 于 2008-12-31 21:12 编辑 ]

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

回复 #6 win_hate 的帖子

这程序真难读

论坛徽章:
0
8 [报告]
发表于 2008-12-31 21:40 |只看该作者
原帖由 tyc611 于 2008-12-31 21:20 发表
这程序真难读


其实你用过 scheme 就不会觉得难读了。

这样会不会好一点?


  1. (define (square x) (* x x))

  2. (define (f xs)
  3.   (let ((m (apply min xs))
  4.         (s (apply + (map square xs))))
  5.     (- s (square m))))
复制代码

论坛徽章:
0
9 [报告]
发表于 2008-12-31 22:14 |只看该作者
照win_hate老大的算法,来个python的
>>> def foo(a, b, c):
...     return sum(map(lambda x:x*x, (a, b, c))) - min(a,b,c)**2
...
>>> foo(1, 2, 3)
13

论坛徽章:
0
10 [报告]
发表于 2008-12-31 22:22 |只看该作者
汗,这帖把各路财神都招来了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP