在列表中查找数字的位置

时间:2011-02-24 01:11:09

标签: recursion scheme

嘿伙计们,我有一个功课问题让我感到沮丧!我应该创建最小索引,它将采用非空列表并返回列表中最小数字的索引。 (car ls)的索引= 0,(car(cdr ls))的索引= 1,依此类推。

需要创建一个帮助器来跟踪当前位置,最小位置,最小值和列表。到目前为止,我有这个显示基本算法的程序(不加载)。但是我很难跟踪所有内容并将其放入chez方案代码中。

(define index-helper
  (lambda (ls current-position least-position least-value)
    (if (> (car ls) least-value)
        (add1 (car ls (cdr ls (add1 current-position))))
        (car ls (cdr ls (add1 current-position))))))

;trace
;ls: (4231) c-pos: 0 least-value: 5 least-pos: 0
;ls: (231) c-pos: 1 least-value: 4 least-pos: 1
;ls: (31) c-pos 2 least-value: 2 least-pos: 2
;ls: 1 c-pos: 3 l-v: 2 l-pos: 2
;ls '() c-pos: 4 l-v: 1 l-pos: 4
;*least-position = current-position

我已经用谷歌搜索了这个并在python中发现了类似的问题,但我不理解代码,因为我是编程的新手。 :P 如果有人能给我一个提示,我真的很感激!

2 个答案:

答案 0 :(得分:1)

你想要两个功能。第一个函数找到最小元素x。第二个函数在列表中查找元素x的索引。

类似的东西:

(define (find-least xs)
  (foldl (lambda (e acc) (min e acc)) (car xs) xs))

(define (elem-index x xs)
  (define (elem-index-find x xs ind)
    (cond
      ((empty? xs) ind)
      ((eq? x (car xs))
       ind)
      (else (elem-index-find x (cdr xs) (+ ind 1)))))
  (if (empty? xs)
      (error "empty list")
      (elem-index-find x xs 0)))

(define (index-of-least xs)
  (let ((least (find-least xs)))
    (elem-index least xs)))

测试:

> (index-of-least (list 5 8 4 9 1 3 7 2))
4

或者,一次通过:

(define (index-of-least-1-pass xs)
  (define (index-do least ind-least ind xs)
    (cond
      ((empty? xs) ind-least)
      ((< (car xs) least)
       (index-do (car xs) (+ ind 1) (+ ind 1) (cdr xs)))
      (else
       (index-do least ind-least (+ ind 1) (cdr xs)))))
  (index-do (car xs) 0 0 (cdr xs)))

测试:

> (index-of-least-1-pass (list 5 8 4 9 1 3 7 2))
4

首先在index-do辅助函数中检查中间列表是否为空;这是一个基本情况,当我们在列表中只有一个元素时,返回它的索引。

下一个条件检查中间列表的下一个元素是否大于当前least值,如果是,我们使用新值least及其索引调用helper。

当下一个元素不大于least时,选择最后一个条件,并调用具有相同值leastind-least的辅助函数,以及中间函数删除头元素的列表,直到列表中没有元素为止,当列表中没有元素时,我们接近基本案例。

答案 1 :(得分:1)

一个名为let 的的好例子:

(define (index-of-least xs)
  (let loop ((i 0) (p 0) (x (car xs)) (xs (cdr xs)))
    (cond ((null? xs) p)
          ((< (car xs) x) (loop (+ i 1) (+ i 1) (car xs) (cdr xs)))
          (else (loop (+ i 1) p x (cdr xs))))))

(index-of-least (list 5 8 4 9 1 3 7 2)) => 4