我正在尝试编写一个函数,它接受一个输入数字并以相反的顺序输出数字.
即:
输入 - > 25输出 - > 52
输入 - > 125输出 - > 521
我是lisp的新手,如果它有用的话是c ++中的工作函数
function.cpp
int revs(int rev, int n)
{
if (n <= 0)
return rev;
return revs((rev * 10) + (n % 10), n/10);
}
Run Code Online (Sandbox Code Playgroud)
我在Racket中写了如下:
(define (revs rev n)
(if (<= n 0)
rev
(revs (+ (* rev 10) (modulo n 10)) (/ n 10))))
Run Code Online (Sandbox Code Playgroud)
但当我运行它(转速0 125)时,我收到此错误:
modulo: contract violation
expected: integer?
given: 25/2
argument position: 1st
other arguments...:
10
Run Code Online (Sandbox Code Playgroud)
当然我在这里做错了,但我不确定我错过了什么.
除法运算符/不进行整数除法,而是一般除法,所以当你打电话时,例如(/ 25 2),你没有得到12或者13,而是理性25/2.我认为你想要的quotient是文档所包含的内容:
Run Code Online (Sandbox Code Playgroud)procedure (quotient n m) ? integer? n : integer? m : integer?退货
(truncate (/ n m)).例子:Run Code Online (Sandbox Code Playgroud)> (quotient 10 3) 3 > (quotient -10.0 3) -3.0 > (quotient +inf.0 3) quotient: contract violation expected: integer? given: +inf.0 argument position: 1st other arguments...: 3
按字典顺序处理操作:
#lang racket
(define (lexicographic-reverse x)
(string->number
(list->string
(reverse
(string->list
(number->string x))))))
Run Code Online (Sandbox Code Playgroud)
适用于任何 Racket 的数字类型[1]。
[编辑 1] 我意识到“作品”是依赖于上下文的,并且通过一些测试显示了操作的隐含假设。我天真的字典方法使负整数变得一团糟,例如(lexicographic-reverse -47)会产生错误。
但是,-74如果我出于字典顺序而不是数字原因反转数字,则获得错误而不是可能会更好,因为它说明了“反转数字”的定义是任意的事实。47 的反转也可能是 -74 和 74,因为反转不是一个数学概念——尽管它可能让我想起 XOR 排列。
特定的反转功能如何处理符号是任意的。
#lang racket
;; Reversing a number retains the sign
(define (arbitrary1 x)
(define (f n)
(string->number
(list->string
(reverse
(string->list
(number->string n))))))
(if (>= x 0)
(f x)
(- (f (abs x)))))
;; Reversing a number reverses the sign
(define (arbitrary2 x)
(define (f n)
(string->number
(list->string
(reverse
(string->list
(number->string n))))))
(if (>= x 0)
(- (f x))
(f (abs x))))
Run Code Online (Sandbox Code Playgroud)
相同的考虑扩展到 Racket 的其他数字类型符号;关于倒车准确,不精确的,复杂的决策,同样是任意的-例如,什么是IEEE的反向+inf.0或+nan.0?