2014-11-21 49 views
0

在計劃中寫入函數時出現問題。該方法將表示爲符號列表的單詞作爲輸入,並且對於每個字符執行哈希方程並返回值。最終值是集合中每個字符的散列值的總和。計劃 - 如何在字符串中查找字符索引

想象一個字符串作爲字符數組'w',其中w [i]是數組中每個字符的索引。

該等式是單詞中每個字符的總和 - > 7^i * ctv(w [i])。

對於每個字母其中CTV(「字符到值」)的地圖 'a' 到1, 'B' 到2,...和 ​​'Z' 到26

例如,鍵( 「day」) =(7^0 * ctv('d'))+(7^1 ctv('a'))+(7^2 ctv('y'))= 1236

SO,我對這個問題的實際問題是我如何找到索引,我在w [i]中爲單詞中的每個字符。 這是我的第一個想法,使用(長度W)作爲索引,但我知道這是不正確的。

(define keys 
    (lambda(w) 
    (if(null? w) 
     0 
    (+ (* (ctv(car w)) (expt 7 (length w))) (keys (cdr w))))) 
    ) 

我的下一個想法可能是它的大小lambda,像這樣。 注意 - 我知道它需要更改爲(大小1)。

(define keys 
    (lambda(size) 
    (lambda(w) 
     (if(null? w) 
     0 
     (+ (* (ctv(car w)) (expt 7 (size w))) (keys (cdr w))))) 
    ) 

但即使如此,其尺寸將仍是索引的相反端,例如與「日」,大小-1「d」爲2,並且對於大小-1「Y」將是0

無論如何,如果任何人有任何想法我在說什麼,並有可能的解決方案或建議,請回復!

回答

1

這裏的技巧是將索引作爲參數傳遞,並在遍歷列表的同時遞增它。此外,它更容易,如果我們將輸入字符串轉換成字符的列表,例如:

(define (key word) 
    (let loop ((chars (string->list word)) ; list of chars 
      (idx 0) ; current index 
      (acc 0)) ; accumulated result 
    (if (null? chars) ; if the list is empty 
     acc   ; return the accumulator 
     (loop (cdr chars) ; otherwise go to the next char 
       (add1 idx) ; advance the index 
       (+ acc (* (expt 7 idx) (ctv (car chars)))))))) ; compute result 

假設ctv程序正確實現,應該按預期工作:

(key "day") 
=> 1236 
+0

收到以下錯誤: 與字符串>列表:預計類型的參數;給出(h l l o)。測試程序的單詞先前被定義爲:(define hello'(h l l o)),所以我可以在hello上運行'keys'。所以所有單詞都需要表示爲一組符號。 – RCouch 2014-11-22 19:55:23

+0

也在最後一行乘法部分得到這個錯誤: *:預計輸入作爲第二個參數,給定:#;其他的論點是:1 – RCouch 2014-11-22 20:06:41

+0

@RCouch第一個錯誤:在你的問題中,你說輸入看起來像「天」,請用應該用作輸入的_real values_更新問題。對於第二個錯誤:這是因爲在執行'ctv'時出現錯誤,目前它正在返回'#',您必須對其進行修復並正確測試以使此算法正常工作。 – 2014-11-22 23:25:22

1

由於這問題還標記球拍,您可以欣賞使用for/sumin-indexed優雅,只球拍的解決方案:

(define (key word) 
    (for/sum (((c i) (in-indexed word))) 
    (* (expt 7 i) (cvt c)))) 

測試:

> (key "day") 
1236 
+1

刪除了球拍標籤......它實際上需要在方案中而不是球拍。 – RCouch 2014-11-22 20:19:37