【问题标题】:in Scheme: A function that takes a 4 digit integer and adds 1 to each digit in scheme在 Scheme 中:一个函数,它接受一个 4 位整数并在 scheme 中的每个数字上加 1
【发布时间】:2016-10-28 08:42:24
【问题描述】:

下面是我遇到的问题,在此之后我解释了我目前所处的位置以及我创建的代码, 在 Scheme 中编写如下函数:

1.a "digitinc4" - 将一个 4 位整数作为输入,并返回由原始输入整数的数字构成的另一个 4 位整数,每个数字都递增。例如,(digitinc4 4833) 将返回 5944。当数字为 9 时,对应的输出数字应为 0。例如: (digitinc4 4892) 将返回 5903。您可以假设输入数字至少为 1000 - 也就是说,没有前导零。

b.扩展您在上述问题 (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 增加那个数字后,我可以跳过下一个数字增加

有一些特殊情况,如果一个数字是9加1就会变成0。(因为9+1 = 10) 所以我可以检查这个数字是否为零(在加法之后)以知道跳过下一个数字加法使用 mod: 4816+1 >>>> 4817 % 10 不等于零。所以我知道数字不是零,所以我可以继续添加+10 这是使用 mod 的情况: 4819+1 >>>> 4820 % 10 = 0 所以我知道我现在可以跳过 +10 并添加 +100(因为我不想增加一个数字两次

基于此,我生成了一些运行但没有达到理想结果的代码。 一切都按预期进行,直到第一个条件结束。 在第二个条件下,在第一次测试中,调试器说 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 或者 2,如果第一个溢出,则执行第二个操作。最好不要溢出,以便您可以分别处理每个数字。打破数字,增加而不溢出,加入结果。您可以通过转换为数字并返回,或者您可以使用 10 的幂来计算商/余数。我会使用 SRFI-1 unfold-rightmapfoldquotient 将进行整数除法。

标签: algorithm scheme racket


【解决方案1】:

您应该复习一些基本的 Scheme 编程 - 函数的结果是其主体中最后一个表达式的值,并且加法不会修改其任何操作数。

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

即使你修正了分割,(di4 4819) 也会这样做:

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

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

  1. 将输入整数分解为数字。
  2. 将您的规则分别应用于每个数字。
  3. 将数字重新组合成一个整数。

类似这样的:

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

【讨论】:

    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多