2014-11-15 3 views
0

Я пытаюсь написать функцию схемы, которая принимает в списке букв, хэширует их с другой функцией, умножает каждую итеративно на 5^i и суммирует их вместе. Я новичок в схеме, и это то, что я написал:Помощник схемы Функция и всегда возвращающая нуль

(define (key w) 
    keyhelper w 0) 

(define (keyhelper w i) 
    (cond ((null? w) '()) 
      (else (+ (* (hashchar(car w) (expt 5 i)) (keyhelper(cdr w) (+ i 1))))))) 

Так, например, делать (ключ «(привет)) должны делать hashchar (h) * 5^0 + hashchar (е) * 5^1 + hashchar (l)^5^2 ... и т. Д. Функция возвращает только 0 для любого списка, который отправлен. Может ли кто-нибудь сказать мне, где я ошибаюсь?

Моя реализация hashchar является:

(define hashchar 
    (lambda (x) 
(cond 
    ((eq? x 'a) 1) 
    ((eq? x 'b) 2) 
    ((eq? x 'c) 3) 
    ((eq? x 'd) 4) 
    ((eq? x 'e) 5) 
    ((eq? x 'f) 6) 
    ((eq? x 'g) 7) 
    ((eq? x 'h) 8) 
    ((eq? x 'i) 9) 
    ((eq? x 'j) 10) 
    ((eq? x 'k) 11) 
    ((eq? x 'l) 12) 
    ((eq? x 'm) 13) 
    ((eq? x 'n) 14) 
    ((eq? x 'o) 15) 
    ((eq? x 'p) 16) 
    ((eq? x 'q) 17) 
    ((eq? x 'r) 18) 
    ((eq? x 's) 19) 
    ((eq? x 't) 20) 
    ((eq? x 'u) 21) 
    ((eq? x 'v) 22) 
    ((eq? x 'w) 23) 
    ((eq? x 'x) 24) 
    ((eq? x 'y) 25) 
    ((eq? x 'z) 26)))) 
+0

Где находится 'hashchar'? –

+0

hashchar определяется в другом файле, который я включил в начало. hashchar преобразует букву в ее число, например a = 0, b = 1, c = 2 и т. д. – WinterStar

+0

Отсутствует открывающая скобка перед вызовом 'keyhelper'. – uselpa

ответ

2

key возвращает ноль все время, потому что вы определили его таким образом. Вы были:

(define (key w) 
    keyhelper 
    w 
    0) 

, таким образом, он оценивает keyhelper (отбрасывая его значение), то w (отбрасывая его значение), то 0 (возвращая его значение). Таким образом, ответ всегда равен 0.

Вы должны вместо этого определить это следующим образом:

(define (key w) 
    (keyhelper w 0)) 

Обратите внимание, что дополнительные скобки.

Также неверно значение базового футляра для keyhelper. Это не должно быть '(), оно должно быть i.

+0

Спасибо, но когда я пробовал этот код, который вы отправили, я получаю сообщение об ошибке: application: not the procedure; ожидал процедуры, которая может быть применена к аргументам – WinterStar

+1

Понял, что у меня была функция с неправильным именем. – WinterStar

0

Если ваше определение hashchar похож на this one:

(define (hash:hash-char-ci char n) 
    (modulo (char->integer (char-downcase char)) n)) 

(define hash:hash-char hash:hash-char-ci) 

Тогда hashchar вернет 0, когда i = 0 передается (expt 5 i) потому (expt 5 i) это один, и одномодуль любого целого числа равен нулю.

После того, как вы умножаете ноль в вашу хэш-функции, то вы всегда будете получать обнулять ... так как + не делает ничего, кроме возвращения идентичности, потому что она передается только один аргумент:

(* (hashchar(car w) (expt 5 i)) (keyhelper(cdr w) (+ i 1))) 

Может быть string-hash - лучший выбор функции библиотеки?

+0

Я опубликовал реализацию hashchar выше. – WinterStar

Смежные вопросы