我现在一直在努力解决这个问题。有人可以用最简单的方式解释程序背后的逻辑吗?
谢谢。
答案 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