1

How to go through a list or fetch element from a list in scheme?

How can I name each element (like we do for variables in java) in a list?

Thanks in advance.

I want to compare every point in a list to another point. So, as we do in java or python-

for(int i;i<list.size();i++){
    if (list[i]> k){ 
        //do something
    }

}

How can I do similar thing in scheme?

4

7 回答 7

5
(map (lambda (x) (if (< x k) (dosomething x) x)) list)
于 2009-06-12T09:00:49.187 回答
4

leppie 和 Jonas 给出了在 Scheme 中迭代列表的正确答案。但是,如果您需要在列表中获取单个值,请使用list-ref.

(let ((l '(1 2 3 4)))
  (list-ref l 2))

=> 3

大部分相当于Java代码

int[] l = new int[] { 1, 2, 3, 4 };
return l[2];
于 2009-06-12T13:44:20.080 回答
2

用函数式语言编写时,您应该以不同的方式思考。其实你应该忘记编程思维(for循环等),只要定义你想要的。例如“我想对列表中的每个奇数应用一个动作。” 所以你会写:

(map an-action
     (filter odd? my-list))

或者条件可以是 element > 4

(define (higher-than-four? n) (> n 4))
(map an-action
     (filter higher-than-four?
             my-list))

对于一个动作,你给出任何函数:

> (map number->string
       (filter higher-than-four? my-list))
("5" "6" "7" "8" "9" "10")
于 2009-12-11T21:15:59.103 回答
2

您可以使用for-each

    (let ((a-list (list 9 2 7 6 1 4 3 8 1))
          (k 4)
          (显示的东西))
      (for-each (lambda (i) ; 列表元素的“名称”是 i
                  (如果(> ik)
                      (我的东西);和我做点什么
                      #F)) ; 没做什么
                一个列表))

for-each类似于,map但返回值未指定。仅因其副作用而被称为。

在旁注中,在我看来,您正在学习来自 java 背景的方案(没关系)。Scheme 程序通常以与 Java 不同的风格编写。Scheme 是一种函数式语言,循环结构的使用并不那么频繁。拿起一本关于 Scheme 的书,例如The Scheme Programming LanguageHow to Design Programs来学习如何以“Scheme 方式”编写程序

于 2009-06-12T09:04:58.757 回答
0

Example

`(define func
  (lambda (a b)
    (if (> a b)
        (dosomething a))))`

In this case, "dosomething" would be some other definition, either predefined or not. Definition being analogous to a "function" let's say, such as square() or mult(), as examples.

I think a recursive one like this should work for the list needs:

(define (func list) (if (> (car list) k) (dosomething)) (func (cdr list)))

You can also write two definitions, have one contain a list and send it to the first example and return the result, compare, do something or not, and continue.

于 2009-06-12T08:49:58.103 回答
0

您可以使用list-ref它的索引从列表中提取一个值。但请注意,Scheme 中的列表实际上是链表——因此(list-ref l 100) 需要跟踪 100 个引用。如果您真的想要随机访问值,请使用向量。

于 2009-06-26T10:48:36.017 回答
0

我不确定这是否是您想要的,但这会转到整个列表(链接)并将每个元素与您作为参数传递的元素进行比较:

(define (compare aList element)
      (if (> element (car aList)) 
         (display (car aList)) ;here do something great
         ;here the else if you have
        )
      (if (not (null? (cdr aList)))
               (compare (cdr aList) element)) 'ok)

这是一个程序的问题,也许它对某人有帮助。

打招呼

于 2010-04-20T22:03:45.230 回答