Scheme 数字出现的次数

Scheme 数字出现的次数,scheme,racket,Scheme,Racket,好的,我上学期参加了这个计划,我知道你们不可能在一个学期内就这么擅长这个计划。一位朋友问我如何计算某个数字在一个数字中出现的次数。如果是一张单子,我知道该怎么办。起初我认为这是一个简单的使用内置商或余数,但并没有结束,它看起来像我。例如,如何计算数字中出现5的次数:(numfives 125458563)应返回3。感谢您的帮助 我不是在帮助他,我是为自己。我喜欢挑战 然后将一个数字转换为一个列表,然后找出一个数字在一个数字中出现的次数。 用于将数字转换为列表,使用string->list将字符串

好的,我上学期参加了这个计划,我知道你们不可能在一个学期内就这么擅长这个计划。一位朋友问我如何计算某个数字在一个数字中出现的次数。如果是一张单子,我知道该怎么办。起初我认为这是一个简单的使用内置商或余数,但并没有结束,它看起来像我。例如,如何计算数字中出现5的次数:(numfives 125458563)应返回3。感谢您的帮助


我不是在帮助他,我是为自己。我喜欢挑战

然后将一个数字转换为一个列表,然后找出一个数字在一个数字中出现的次数。
用于将数字转换为列表,使用
string->list
将字符串转换为字符列表。然后,按照你所说的那样,列出一个你已经知道该怎么做的清单。(您可以使用各种格式功能将数字转换为字符串。)

这里有一种可能的方法:将
数字
参数转换为字符列表,并计算与作为参数接收的
数字
对应的字符数:

(define (num-digits number digit)
  (let ((n (number->string number))
        (d (integer->char (+ (char->integer #\0) digit))))
    (count (lambda (x) (char=? x d))
           (string->list n))))
编写上述过程的另一种方法,更短但更难阅读:

(define (num-digits number digit)
  (count (curry char=? (integer->char (+ (char->integer #\0) digit)))
         (string->list (number->string number))))
另一种选择是通过算术运算依次处理每个数字,如@ChrisJester-Young的答案所示,但考虑到边缘情况,即数字和数字均为零,避免重新定义内置的
count
过程-还要记住,这只适用于整数>=0和基数为10的情况。以下是方法:

(define (num-digits number digit)
  (if (= number digit 0)
      1
      (let loop ((num number)
                 (counter 0))
        (cond ((zero? num)
               counter)
              ((= digit (remainder num 10))
               (loop (quotient num 10) (add1 counter)))
              (else
               (loop (quotient num 10) counter))))))
上面基于字符串的解决方案可能看起来有点笨重,但编写时间较短,并且具有处理负数、小数、以10为基数的数字等其他优点。无论如何,这在任何版本中都适用:

(num-digits 125458563 5)
> 3
这将适用于基于字符串的版本:

(num-digits -123.1234152 1)
> 3

我不喜欢所有基于字符串的解决方案

在我看来,最好的方法是在每个阶段将每个数字除以10,然后进行比较。例如:

(define (count-digit num digit)
  (let loop ((num num)
             (count 0))
    (if (zero? num) count
        (loop (quotient num 10)
              (+ count (if (= digit (remainder num 10)) 1 0))))))

48听起来有点太神奇了。如果他们不在基于ASCII的系统上怎么办?最好使用
(char->integer\0)
。即使这样,也假设所有数字都是连续表示的。我仍然想知道是否有一个数字不进行任何数字的计数,只针对一个特定的数字,如我的示例所示。(numfives 255353)返回3。我相信他数学能力的人对我说,要找到一个公式是不可能的。在上面的例子中,Like不应该有两个参数(数字)。起初我认为这更容易,但现在听起来更忙了。好吧,你可以根据更一般的解决方案为每种情况编写一个专门的函数。例如,这个过程只计算五个:
(define(numfives number)(num digits number 5))
哦,我知道你做了什么。好的,简单的方法,不是那样看的。在之前的过程中,您使用了“add1”,我不得不将其更改为(+1)。我不知道“add1”在scheme中起作用。上面的解决方案在这种边缘情况下将失败:
(计数位数0)
它返回零,但正确答案是一。此外,您正在重新定义内置的
计数过程。+1我也会这样做,但如果没有(abs num),它对负数不起作用它也不适用于浮点数,当字符串版本为DOW时,如果它不是整数怎么办?如果你想使用不同的底座怎么办?这个问题基本上是关于数字的文本表示,因此(IMO)字符串是处理它的最佳方式。