getting the largest number in a list in scheme

前端 未结 6 1719
长发绾君心
长发绾君心 2021-01-23 23:00

I do not understand why my function to get the largest number does not want to work. If I am thinking about this correctly, if the first atom is smaller than the second atom the

6条回答
  •  闹比i
    闹比i (楼主)
    2021-01-23 23:54

    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)
    

提交回复
热议问题