Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递增Scheme中的字母字符串_Scheme - Fatal编程技术网

递增Scheme中的字母字符串

递增Scheme中的字母字符串,scheme,Scheme,我试图以编程方式在Scheme中增加一个纯字母顺序的字符串 就像这个“MA”,然后是“MB”,当它达到“MZ”时,它应该变成“MAA”,依此类推,直到“MZZ”,然后变成“MAAA”,依此类推。需要添加“M”作为我正在做的工作的前缀 我看了这个问题:这正是我想要的 然而,我完全不知道从哪里开始。对于初学者,我甚至不知道如何在scheme中处理ASCII。我并不期待完整的代码,但如果我得到一些提示,我将不胜感激。这是我的实现。请注意,您需要加载,它提供了向右展开: (define letters

我试图以编程方式在Scheme中增加一个纯字母顺序的字符串

就像这个“MA”,然后是“MB”,当它达到“MZ”时,它应该变成“MAA”,依此类推,直到“MZZ”,然后变成“MAAA”,依此类推。需要添加“M”作为我正在做的工作的前缀

我看了这个问题:这正是我想要的


然而,我完全不知道从哪里开始。对于初学者,我甚至不知道如何在scheme中处理ASCII。我并不期待完整的代码,但如果我得到一些提示,我将不胜感激。

这是我的实现。请注意,您需要加载,它提供了
向右展开

(define letters "ABCDEFGHIJKLMNOPQRSTUVWXYZ")

(define (number->letters num)
  (unfold-right negative?
                (lambda (i) (string-ref letters (remainder i 26)))
                (lambda (i) (- (quotient i 26) 1))
                num))

(define (number->tag num)
  (list->string (cons #\M (number->letters num))))
示例:

> (number->tag 0)
"MA"
> (number->tag 18277)
"MZZZ"
> (number->tag 18278)
"MAAAA"

OP要求解释代码的作用。因此,在理解OP已经理解算法(因为他们已经链接到它)的情况下,基本上剩下的是展开操作

Fold和unfold的解释有点冗长,我不想通过解释它们来破坏这篇文章,但是可以将unfold“扩展”到等效的循环中(使用与
unfold right
的SRFI 1相同的变量名)来表示发生了什么:

(define (number->letters num)
  (let lp ((seed num) (ans '()))
    (if (negative? seed)
        ans
        (lp (- (quotient seed 26) 1)
            (cons (string-ref letters (remainder seed 26)) ans)))))
基本上,它使用
(string ref letters(余数seed 26))
每次迭代(其中
seed
在初始迭代中是
num
)从右到左构建一个列表<代码>种子的值随后更新为下一次迭代的
((商种子26)1)
。当
(负?种子)
为真时,列表停止


然后,您可能会问,为什么要使用展开而不是循环。基本上,在函数式编程中,当一个“概念”可以用更高级的术语表达时(例如,for each、map、filter、fold或unfold),使用这些术语可以帮助其他程序员理解代码的功能。这有点像函数式编程上下文中的“设计模式”(在面向对象编程中常用)。:-)

谢谢大家!!但是你能给我解释一下代码的实际功能吗?我添加了一个简单的解释。让我知道你还有什么需要解释的。:-)我明白了:)不过,我想提高我对折叠和展开以及地图的理解。你能给我提供一些有简单解释的链接吗?我是一个函数式编程的初学者。我阅读了折叠和地图。它们很容易理解。然而,在理解的过程中,我仍然有困难。你能给我指一个资源吗。我理解你对我的解释。很简单:)