2011-02-24 64 views
0

嘿,夥計們,我有一個家庭作業問題,讓我感到無法接受!我應該創建索引最少的,將採取非空列表並返回列表中最小數字的索引。 (car ls)= 0的索引,(car(cdr ls))的索引= 1,依此類推。在列表中找到一個數字的位置

需要創建一個助手來跟蹤當前位置,最小位置,最小值和列表。到目前爲止,我有這個程序(不加載),顯示基本算法..但我很難跟蹤一切,並將其放入chez scheme代碼。

(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 

我已經用Google搜索,發現這個在Python類似的問題,但我不明白的代碼,因爲我是新來編程。 :P 如果有人能給我一個提示,我會非常感激!

+0

如何在問#scheme呢?我不認爲教練希望他們的作業問題像這樣在Google上顯示出來。 – erjiang 2011-02-24 02:33:23

+1

@erjiang:IRC convos也不會登錄嗎? ;-) – 2011-02-24 05:02:18

+0

@Yasir:哈哈,是的,但是SO已經做了很多SEO。 – erjiang 2011-02-26 17:28:12

回答

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及其索引調用助手。

最後一個條件被選擇,當所述下一個元素不大於least更大,並且將其與除去的leastind-least,並且與磁頭元件的中間列表中的相同的值,直到有在沒有元素調用輔助函數該清單,並且當列表中沒有元素時,我們接近基本案例。

1

一個很好的例子命名爲讓

(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 
相關問題