Scheme函数返回两个列表中较长的列表,如果它们相等则返回true

问题描述 投票:1回答:2

我是新手计划和解决如下定义的问题:

编写一个名为long-list的函数,它接受两个列表参数并返回两个输入的较长列表。如果两个列表的长度相等,则函数返回#t,如果其中一个参数不是列表,则函数应返回#f。注意:不允许使用预定义的长度函数;但是,您可以编写您可能想要从较长列表中调用的长度版本或其他帮助程序函数。

Sample runs:

(longer-list '(1 2 3 4) '(a b c d e)) returns (a b c d e)
(longer-list '(d e f) '(4 5 6)) returns #t (or true)
(longer-list '(g h i) 3) returns #f (or false)

到目前为止我所拥有的是:

;;helper function to determine the length of a list
(define (list-length lst)
  (if (null? length)
    0
    (+1 (list-length (cdr lst)))))

 ;;main function to return the longer of 2 lists or True if they are equal 
 (define (longer-list lst1 lst2)
   ;;check if both parameters are actually lists
   (and (list? lst1)
      (list? lst2)
      ;;if lst1 is the longer list return lst1
      (if(> (list-length lst1) (list-length lst2))
         lst1)
      ;;else lst2 is longer, return that 
      (else (> (list-length lst1 (list-length lst2))
         lst2))

     ;define comp as comparing list1 abbreviated by x and list2 abbreviated by y???
     (let comp ((x lst1) (y lst2))
       (cond
         ;;if both lists are null return true
         ((and (null? x) (null? y)) #t)
         ;;not sure what this means?
         ((null? x) lst2)
         ;;not sure what this means? 
         ((null? y) lst1)
         ;;else invoke comp after the first element of each list is removed???
         (else (comp (cdr x) (cdr y)))))))

目前我收到以下错误:

“if:在:中缺少”else“表达式:(if(>(list-length lst1)(list-length lst2))lst1)”

我的问题是导致此错误的原因。另外,我在网上找到了一些这样的代码,需要确保我完全理解它,所以如果有人可以检查我的评论,看看它们是否有意义,我们将不胜感激。

racket
2个回答
3
投票

当然,你的解决方案很好。原始代码中的错误是由于错误使用if引起的,请阅读docs。你在网上找到的代码只是同时遍历两个列表,如果一个在另一个之前结束,那是因为它更短。

更好的选择是使用你已经拥有的list-length程序 - 这样做的好处是不必编写显式循环。在Scheme中,我们尝试重用现有的程序而不是编写新的程序;例如:

(define (list-length lst)
  (if (null? lst)
      0
      (+ 1 (list-length (cdr lst)))))

(define (longer-list lst1 lst2)
  (if (or (not (list? lst1)) (not (list? lst2)))
      #f
      (let ((len1 (list-length lst1))
            (len2 (list-length lst2)))
        (cond ((> len1 len2) lst1)
              ((< len1 len2) lst2)
              (else #t)))))

它按预期工作,更容易理解!

(longer-list '(1 2 3 4) '(a b c d e))
=> '(a b c d e)
(longer-list '(d e f) '(4 5 6))
=> #t
(longer-list '(g h i) 3)
=> #f

1
投票

这似乎有效

#lang racket

(define (longer-list lst1 lst2)
  (and (list? lst1)
     (list? lst2)

     (let comp ((x lst1) (y lst2))
       (cond
         ((and (null? x) (null? y)) #t)
         ((null? x) lst2)
         ((null? y) lst1)
         (else (comp (cdr x) (cdr y)))))))
© www.soinside.com 2019 - 2024. All rights reserved.