需要帮助查找列表中的第二大数字。球拍

时间:2017-03-12 01:17:54

标签: recursion functional-programming lisp racket

我现在一直在努力解决这个问题。有人可以用最简单的方式解释程序背后的逻辑吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

有2个变量(比如x和y)

浏览数字列表

在x中保持最大值,在y中保持前一个最大值(前一个x值)

结束时返回y值。

请记住将每个值与x和y的当前值进行比较。

我测试了它并且它有效,但我确定你想自己编码。注意选择x和y的起始值。

修改

参考评论中的讨论(使用-inf.0作为@naomik回答的初始值):

(define steps 0)

(define (gt x y)
  (set! steps (add1 steps))
  (> x y))

(define (lt x y)
  (set! steps (add1 steps))
  (< x y))

(define (2ndLargest L)
  (let loop ((x -inf.0)  ; largest
             (y -inf.0)  ; second largest
             (L L))
    (cond
      [(empty? L)
       (printf "steps=~a;~n" steps)
       y]
      [(or (= (first L) x)(= (first L) y))
       (loop x y (rest L))]
      [(gt (first L) x)
       (loop (first L) x (rest L))]
      [(gt (first L) y)
       (loop x (first L) (rest L))]
      [else
       (loop x y (rest L))]
      )))

(define (2ndLargest2 L)
  (let loop ((x -inf.0)  ; largest
             (y -inf.0)  ; second largest
             (L L))
    (cond
      [(empty? L)
       (printf "steps=~a;~n" steps)
       y]
      [(or (= (first L) x)(= (first L) y))
       (loop x y (rest L))]
      [(lt (first L) y)             ; FIRST CHECK IF LESS THAN Y; 
       (loop x y (rest L))]
      [(gt (first L) x)
       (loop (first L) x (rest L))]
      [(gt (first L) y)
       (loop x (first L) (rest L))]
      )))

(define L '(8 3 4 5 6 2 7 3 10 12 -1 11))
(2ndLargest L)
(2ndLargest2 L)

(set! L '(11 8 3 4 5 6 2 7 3 10 -1 12))
(2ndLargest L)
(2ndLargest2 L)

(set! L '(8 3 4 5 6 11 7 3 10 12 -1))
(2ndLargest L)
(2ndLargest2 L)

输出:

steps=21;
11
steps=48;
11
steps=70;
11
steps=88;
11
steps=107;
11
steps=131;
11

如果检查电流是否小于y,则步数更多。

答案 1 :(得分:1)

我使用foldl对此进行了调整 - 它与mso的答案类似,使用累加器(cons x1 x2)跟踪列表中的两个(不同的)最高数字,其中{{1} }是最高的x1是第二高的

此答案将返回x2以获取空列表的输入或单个数字列表的输入

-inf.0