Your current procedure is failing at runtime. Even if it didn't, you're comparing one element with the next, but that won't work for finding a maximum, for instance in a list such as this it'll return 1
, which is incorrect: '(10 2 0 1)
. There are other mistakes, for instance - why are you building a list as output, when the answer should be a number? also you have to be very careful with the edge cases, your procedure is failing when there's a single element left in the list.
The correct way is to compare one element assumed to be the maximum with all the rest, if we find one that is greater than the assumed maximum, then we've found a new maximum. This is what I mean:
(define (getlargest a_list)
(if (null? a_list) ; edge case: empty list
#f ; return a special value signaling error
(let loop ((a_list (cdr a_list)) ; rest of the list
(maxval (car a_list))) ; assumed maximum
(cond ((null? a_list) maxval) ; if the list is empty, return max
((> (car a_list) maxval) ; current element > max
(loop (cdr a_list) (car a_list))) ; found new max
(else ; otherwise
(loop (cdr a_list) maxval)))))) ; keep the same max
Of course, in real life we would use the built-in max
procedure for the same purpose:
(apply max a_list)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…