下面是我给出的问题,在此之后我解释了我到目前为止的位置以及我创建的代码, 在Scheme中编写以下函数:
1.a" digitinc4" - 作为输入输入一个4位整数,并返回由原始输入整数的数字构成的另一个4位整数,每个整数递增。例如,(digitinc4 4833)将返回5944.当数字为9时,相应的输出数字应为0.例如: (digitinc4 4892)将返回5903.您可以假设输入数字至少为1000 - 也就是说,没有前导零。
湾在上面的问题(a)中扩展你的答案,以处理具有任意位数的输入整数。此功能应命名为" digitinc" (名称中没有" 4")。例如: (digitinc 83)将返回94,(digitinc 22897)将返回33908。
到目前为止,我知道我可以通过添加
来递增每个数字+1
+10
+100
+1000
等
以及作为一个例子
以下结果是剩余部分,它们也与我要测试的数字相对应:
assuming input is 4816
1st digit 4816 % 10 = 6 (does not equal 0, increment next digit)
2nd digit 4816 / 10 = 481.6
481.6 % 10 = 1 (does not equal 0, increment next digit)
3rd digit
481.6 / 10 = 48.16
48.16 % 10 = 8 (does not equal 0, increment next digit)
4th digit
48.16 / 10 = 4.816
4.816 % 10 = 4 (does not equal 0, increment next digit)
我可以使用这些余数来确定某些东西是否为0 递增该数字后,我可以跳过下一个数字增量
如果数字为1,则数字将变为0时会出现一些特殊情况。(因为9 + 1 = 10) 所以我可以检查这个数字是否为零(加法后),以便知道跳过下一个数字加法 mod:4816 + 1>>>> 4817%10不等于零。所以我知道数字不为零所以我可以继续添加+10 这是使用mod的情况: 4819 + 1>>>> 4820%10 = 0所以我知道我现在可以跳过+10并添加+100(因为我不想增加两位数字
基于此我生成了一些运行但尚未达到理想结果的代码。 一切都按预测工作,直到第一个cond结束。 通过第二个cond,在第一次测试时,调试器说2408/5正在发生。 我完全迷失在这里,我已经多次调试,但drracket不够复杂,不能给我更多细节。 如果有人可以就这种情况分享一些见解或建议,或者我可以用更简单有效的方式实现我所拥有的东西。
以下是我的方案代码:
(define (mod x)
(modulo x 10))
(define (di4 n)
(+ n 1) ; increment 1st digit
(cond ;check if 1st digit became 0 if so skip and increment 100 otherwise continue normal
[(= (mod n) 0) (+ n 100)] ;increment 3rd if 2nd is 0
[else (+ n 10)]) ;increment 2nd digit
(cond
[(= (mod (/ n 10)) (+ n 1000))] ;increment 4th if 3rd is 0
[else (+ n 100)]) ;increment 3rd
(cond
[(= (mod (/ n 100) (+ n 10000)))] ;increment 5th if 4th is 0
[else (+ n 1000)]) ;increment 4th
)
答案 0 :(得分:1)
您应该查看一些基本的Scheme编程 - 函数的结果是其正文中最后一个表达式的值,而addition不会修改其任何操作数。
此外,应用于整数的/
执行精确除法,而不是(截断)整数除法 - 结果是分数,而不是整数。
您应该使用quotient
。
即使您修复了部门,(di4 4819)
也会执行此操作:
如果将其转换为操纵数字集合而不是整个整数的问题,则此练习更容易:
这样的事情:
; The rule for incrementing one digit.
(define (inc-digit n)
(modulo (+ n 1) 10))
; Assemble four digits into an integer.
(define (make-int4 a b c d)
(+ (* a 1000) (* b 100) (* c 10) d))
; Increment four digits and assemble into an integer.
(define (make-inc4 a b c d)
(make-int4 (inc-digit a) (inc-digit b) (inc-digit c) (inc-digit d)))
; Shorthand
(define (mod10 x)
(modulo x 10))
; Disassemble the input, then reassemble it.
(define (di4 n)
(make-inc4 (mod10 (quotient n 1000))
(mod10 (quotient n 100))
(mod10 (quotient n 10))
(mod10 n)))
概括将遵循相同的一般模式,但使用列表;你最近可能已经了解了列表递归和map
函数。