我需要一些帮助:D。
我编写了这个程序,将字符串转换为数字列表:
ngrok
我需要一个完全相反的函数。换句话说,获取基数4中的数字列表,将其转换为基数10,然后创建一个字符串。是否有"创意"改变我的功能的方法或我必须再次写相反的步骤。非常感谢你的帮助。
答案 0 :(得分:0)
取决于您如何定义" creative"。在Racket中你可以这样做:
(define (f lst)
(number->string
(for/fold ([r 0]) ([i (in-list lst)])
(+ i (* r 4)))))
然后
> (f '(1 0 0))
"16"
> (f '(1 3 2 0 2 1 0 0 0))
"123456"
答案 1 :(得分:0)
#!r6rs
(import (rnrs base)
(only (srfi :1) fold))
(define (base4-list->number b4l)
(fold (lambda (digit acc)
(+ digit (* acc 4)))
0
b4l))
(base4-list->number '(1 2 3))
; ==> 27
它在#lang racket
中的工作方式相同,但您(require srfi/1)
PS:我不完全确定你从基数10到基数4的转换是否是最好的解决方案。想象一下应该变成95
的数字(1 1 3 3)
。我会在SRFI-1中使用unfold-right
完成它。
答案 2 :(得分:0)
您正在寻找的关系称为isomorphism
此处的其他答案使用折叠证明了这一点,但在您的级别上我认为您应该自己这样做 - 或者至少在您更熟悉该语言之前
#lang racket
(define (base10 ns)
(let loop ((ns ns) (acc 0))
(if (empty? ns)
acc
(loop (cdr ns) (+ (car ns)
(* 4 acc))))))
(displayln (base10 '(3 0))) ; 12
(displayln (base10 '(3 1))) ; 13
(displayln (base10 '(3 2))) ; 14
(displayln (base10 '(3 3))) ; 15
(displayln (base10 '(1 0 0))) ; 16
(displayln (base10 '(1 3 2 0 2 1 0 0 0))) ; 123456
答案 3 :(得分:0)
@ naomik的回答提到isomorphisms。当你构造一个同构时,你正在构造一个函数及其反转。通过组合和连接同构,你可以同时构建两个方向。"
;; Converts between a base 4 list of digits (least significant first, most
;; significant last) and a number.
(define iso-base4->number
(iso-lazy
(iso-cond
;; an iso-cond clause has an A-side question, an A-to-B isomorphism,
;; and a B-side question. Here the A-side is empty and the B-side is
;; zero.
[empty? (iso-const '() 0) zero?]
;; Here the A-side is a cons, and the B-side is a positive number.
[cons?
(iso-join
cons
(λ (r q) (+ (* 4 q) r))
[first iso-identity (curryr remainder 4)]
[rest iso-base4->number (curryr quotient 4)])
positive?])))
此代码包含将基本4列表转换为数字并再次返回所需的所有信息。 (此处的基数4列表从最低有效数字到最高有效数字排序。这与正常方向相反,但是可以在外面修复。)
第一个cond案例将空白映射为零并再次返回。
第二个cond案例将(cons r q)
映射到(+ (* 4 q) r)
并再次映射,但是q
递归地在列表和数字之间进行转换。
正如可以使用first
和rest
分割cons单元格,可以将实证数字拆分为" remaining-wrt-4"和它的"商-wrt-4"。由于余数是固定大小且商是任意大小,remainder
类似于first
而quotient
类似于rest
。
first
和remainder
不需要相互转换,因此第一个iso-join
子句使用iso-identity
,这是同时无效的同构。
[first iso-identity (curryr remainder 4)]
rest
和quotient
确实需要转换。其余部分是最低至最高有序的基数4位数,而商是与之对应的数。它们之间的转换是iso-base4->number
。
[rest iso-base4->number (curryr quotient 4)]
如果您对iso-const
,iso-cond
和iso-join
这些同构形式的定义感兴趣,this gist包含此示例所需的所有内容。< / p>