0

我是计划的初学者,我正在尝试学习一些算术递归。我似乎无法使用方案来完成这项工作并产生正确的结果。对于我的示例,我试图通过对字符串中的每个字符进行算术运算来为字符串生成一个整数键。在这种情况下,字符串是一个列表,例如:'(hello). 我需要执行的算术是:

对于字符串中的每个字符,执行 --> (33 * 常量 + 字母在字母表中的位置) 其中常量是输入,字符串作为列表输入。

到目前为止,我有这个:

(define alphaTest
  (lambda (x)
    (cond ((eq? x 'a) 1)
          ((eq? x 'b) 2))))

(define test 
   (lambda (string constant)
      (if (null? string) 1
      (* (+ (* 33 constant) (alphaTest (car string))) (test (cdr string)))

我正在尝试测试一个简单的字符串 (test '(ab) 2),但我无法产生正确的结果。我意识到我的递归一定是错误的,但我一直在玩弄它几个小时,每次都碰壁。任何人都可以为实现这种算术递归提供任何帮助吗?谢谢,麻烦您了。请记住,我是 Scheme 语言的业余爱好者 :)

编辑 我想通过使新常量 = (+ (* 33 常量) (alphaTest (car string))) 在字符串的每次迭代中更改输入的常量。我期望输入字符串 '(ab) 和常量 2 的输出应如下所示:

第一次迭代 '(a): (+ (* 33 2) (1)) = 67 sum = 67, 常数变为 67
第二次迭代 '(b): (+ (* 33 67) (2)) = 2213 sum = 2213 , 常数变为 2213

(test '(a b) 2) => 2280
4

3 回答 3

1
(define position-in-alphabet
  (let ([A (- (char->integer #\A) 1)])
    (lambda (ch)
      (- (char->integer (char-upcase ch)) A))))


(define (test chars constant)
  (define (loop chars result)
    (if (null? chars)
        result
        (let ((r (+ (* 33 result) (position-in-alphabet (car chars)))))
          (loop (rest chars) (+ r result)))))
  (loop chars constant))

(test (list #\a #\b) 2)
于 2013-04-10T09:09:45.157 回答
1

这是你要找的吗?

(define position-in-alphabet
  (let ([A (- (char->integer #\A) 1)])
    (λ (ch)
      (- (char->integer (char-upcase ch)) A))))

(define make-key
  (λ (s constant)
    (let loop ([s s] [constant constant] [sum 0])
      (cond
        [(null? s)
          sum]
        [else
          (let ([delta (+ (* 33 constant) (position-in-alphabet (car s)))])
            (loop (cdr s) delta (+ sum delta)))]))))

(make-key (string->list ) 2) => 0
(make-key (string->list ab) 2) => 2280

顺便说一句,该程序是否应该适用于包含字母以外的字符(如数字或空格)的字符串?在那种情况下,position-in-alphabet可能会产生一些令人惊讶的结果。要制作一个像样的密钥,您可能只需调用char->integer而不用position-in-alphabet. char->integer将为每个字符提供不同的数字,而不仅仅是字母表中的每个字母。

于 2013-04-10T04:27:44.347 回答
0

这是一个解决方案(在 MIT-Gnu 方案中):

(define (alphaTest x)
  (cond ((eq? x 'a) 1)
    ((eq? x 'b) 2)))

(define (test string constant)
  (if (null? string) 
      constant
      (test (cdr string) 
        (+ (* 33 constant) (alphaTest (car string))))))

示例输出:

(test '(a) 2)
;Value: 67

(test '(a b) 2)
;Value: 2213

我只是在每个递归调用中转换常量,并在字符串用完时将其作为值返回。

我去掉了 lambda 表达式,以便更容易看到正在发生的事情。(此外,在这种情况下,实际上并不需要 lambda 形式。)


您的测试程序定义似乎被破坏:

(define test 
  (lambda (string constant)
    (if (null? string) 
    1
    (* (+ (* 33 constant) 
          (alphaTest (car string))) 
       (test (cdr string)))

您的代码如下:

  • 创建一个test接受两个参数的过程;stringconstant

  • 如果string为 null,则传递值 1,以结束递归。否则,将以下值相乘:

    • 某项 x 即 = (33 * constant) + (alphaTest (car string)),以及
    • 某些术语 y 是递归传递(cdr 字符串)到测试过程的输出

我不知道术语 y 将如何评估,因为“测试”需要两个参数。我的解释器出错了。此外,括号是不平衡的。计算中有一些奇怪的地方,我无法指出 - 尝试进行纸质评估,看看在每个递归调用中可能会计算出什么。

于 2013-04-11T05:39:56.577 回答