in Scheme:一个函数,它接受一个4位整数,并为方案

时间:2016-10-28 08:42:24

标签: algorithm scheme racket

下面是我给出的问题,在此之后我解释了我到目前为止的位置以及我创建的代码, 在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
  )

1 个答案:

答案 0 :(得分:1)

您应该查看一些基本的Scheme编程 - 函数的结果是其正文中最后一个表达式的值,而addition不会修改其任何操作数。

此外,应用于整数的/执行精确除法,而不是(截断)整数除法 - 结果是分数,而不是整数。
您应该使用quotient

即使您修复了部门,(di4 4819)也会执行此操作:

  • 计算4819 + 1 = 4820并丢弃结果,然后
  • 计算4819 + 10 = 4829并丢弃结果,然后
  • 计算4819 + 100 = 4919并丢弃结果,然后
  • 计算4819 + 1000 = 5819并从函数返回。

如果将其转换为操纵数字集合而不是整个整数的问题,则此练习更容易:

  1. 将输入整数反汇编为数字。
  2. 将您的规则分别应用于每个数字。
  3. 将数字重组为整数。
  4. 这样的事情:

    ; 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函数。