Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 如何使用foldl筛选列表_Scheme_Fold - Fatal编程技术网

Scheme 如何使用foldl筛选列表

Scheme 如何使用foldl筛选列表,scheme,fold,Scheme,Fold,我试图在Scheme中得到正整数,但必须使用foldl 所以。。。下面是foldl代码 foldl implementation (define foldl (lambda (proc acc lst) (if (null? lst) acc (foldl proc (proc acc (car lst)) (cdr lst))))) 然后我的代码 它应该使用fold:foldl positive integer接受正整

我试图在Scheme中得到正整数,但必须使用foldl

所以。。。下面是foldl代码

foldl implementation
(define foldl
 (lambda (proc acc lst)
  (if (null? lst)
      acc
      (foldl proc
           (proc acc (car lst))
           (cdr lst)))))
然后我的代码 它应该使用fold:foldl positive integer接受正整数。我知道这是错误的,我才刚开始学习这个计划。 这里必须检查1)是否为整数?2) 是肯定的吗?3) 输出应为所有正数的乘积,例如输入“(1 2 3 6 0-5”方案”)=>输出应为:36

[Q1]如何实现嵌套的if-like-if(real?)if(integer。。。。。在foldl内部或以任何其他方式使用foldl?

(define (foldl-positive-integer)
  (foldl
    (lambda (x y) (if (real? x) (* x y) x))
    '()
    lst
))

[Q2]我的代码始终返回空列表?为什么?

关于Q1:您必须以某种方式跳过列表中不是正数的元素。一个想法是先把它们拿出来,正如克里斯所展示的那样。另一种方法是使用
foldl
本身过滤掉它们:

(define (foldl-positive-integer)
  (foldl
    (lambda (x y) (if (real? x) (* x y) x))
    '()
    lst
))
(define (product-of-positives lst)
  (foldl * 1 (filter (lambda (x)
                       (and (number? x) (positive? x)))
                     lst)))
(define (product-of-positives lst)             ; pass input list as parameter
  (foldl (lambda (acc e)                       ; acc goes first in your foldl
           (if (and (number? e) (positive? e)) ; if it's a positive number
               (* e acc)                       ; then multiply it
               acc))                           ; otherwise keep same acc
         1                                     ; multiplicative identity
         lst))                                 ; input list
现在,对于第2个问题:您的实现不正确。首先,您甚至没有将列表作为参数传递-最后的
list
是一个内置过程,您不应该这样命名变量以避免此类混淆-例如,最好使用
lst

假设您修复了这个问题并传递了一个list参数-然后您会发现
acc
参数不正确,如果要将列表相乘,那么它必须是
1
,因为我们正在构建一个数字作为输出(而不是列表),它不可能是
0
,因为它会抵消所有的值——我们毕竟是在乘以它们

最后一件事——仅使用
real?
无法在列表中选择正数。最好使用我们展示的两种实现:

(product-of-positives '(1 2 3 6 0 -5 "scheme"))
=> 36

我很高兴你加入了你的
折叠
,因为累加器作为第一个或最后一个参数是不一致的。现在,我刚刚将您的代码加载到DrRacket中,并重命名了变量,以便可以清楚地看到累加器。错误很明显:

(define (foldl-positive-integer)
  (foldl
    (lambda (acc element) 
      (if (real? acc)      ; never real? since it's a list
          (* acc element)
          acc))
    '()                    ; acc should be the default return, perhaps 1.0?
    list))                 ; NB! using list as a variable overshadows list the procedure
A2:所以对于每个元素,
()
不是
真的?
所以空列表是每次迭代的返回值

现在。如果结果应该是
real?
,那么初始累加器也需要是
real?
。也许
1.0
。然后测试应该在新元素上进行,而不是在我们知道是真实的累加器上进行。我认为工作版本应该是这样的:

(foldl
 (lambda (acc element) 
   (if (real? element) ; fixed from accumulator to element
       (* acc element) ; multiply if real?
       acc))           ; else just continue using the previous acc
 1.0                   ; initial accumulator
 list)
对于A1:连接程序可以是使用任何逻辑的任何东西。唯一的问题是,前一次迭代(或初始值)是第一个参数,要处理的元素是第二个参数。您可以这样做:

(define (fold-join acc e)
  (cond ((list? e) (+ acc (length e)))              ; for lists add the length
        ((and (integer? e) (negative? e) (- acc e))); negative integers, abs 
        ((integer? e) (+ acc e))                    ; positive integers
        (else acc)))                                ; ignore everything else 

(foldl fold-join 0 '((1 2 3) -5 5 2.3 9.8)) ; ==> 13

1,2,3,6的乘积不是12,而是36。对,我和其他练习(偶数)混在一起了。。这不仅仅是偶数。。它是所有数字(整数)的乘法..有效。我喜欢代码旁边的注释。真的很有帮助。谢谢。好奇:另一个问题-你/或其他人的代码何时被删除(第一个,在删除或修改之前)。它是这样的(foldl(lambda e acc)…在第2行中,我从(正数的乘积)(1 2 3 6 0-5“scheme”)中得到了“scheme”,从(正数的乘积)(1 2 3 6 0-5))中得到了“-5”),但如果我只给出正数(正数的乘积)(1 2 3 6)),那么它的输出是正确的36。什么时候是这样的(foldl(lambda e acc)…在第2行..发生了什么?这是因为您更改了传递给
foldl
的函数中参数的顺序,最后返回了最后一个元素的
acc
部分条件,该元素恰好是
“scheme”
。请参阅您上一个问题中关于这一点的讨论,也请参阅此。正如我之前所说,我更喜欢在
foldl
中使用顺序
(e acc)
。我感谢您的回答/我从您的回答中得到了更好的理解,但是,我刚刚看到这个问题收到-2(没有研究工作…)我不知道投票结果如何。但我觉得我应该删除这个问题。也许他们认为这不合适。但我真的很感激你的回答。@user1915570我不同意反对票,让我们把它保留在0分吧-这不是一个很好的问题,但也不是很糟糕。让我们这样做吧。你提供的答案,我也看了这再次提醒我自己。我感谢你的回答/我从你的回答中得到了更好的理解,然而,我刚刚看到这个问题收到-2(没有研究工作…)我不知道投票结果如何。但我觉得我应该删除这个问题。也许他们认为这不合适。但我真的很感激你的回答。@user1915570向下投票是指标,接近投票是社区清理的方式,你作为OP可以选择删除你的帖子。我不介意,我相信Chris和Osca如果你选择删除它和你的权利,也不介意。如果你选择保留它,考虑编辑它,这样它就更容易为别人找到。Eg.将标题改为“如何使用FooDL过滤列表”。.是的。让我们试试。你提供的答案,我也会再看一遍,以提醒自己。我尽量不使用运算符。因为我刚刚开始学习Scheme。所以,尝试用不简单(甚至聪明)的方式做事,直到我习惯为止。这很好,但最终你会找到一个想使用“pro”的地方方法,然后您可以返回此答案。:-)