【问题标题】:Find first number that is a palindrome in the first b bases of some list Racket在某个列表的前 b 个碱基中找到第一个回文数
【发布时间】:2020-04-10 06:25:14
【问题描述】:

找到大于start 的第一个数字,这是2, 3, 4, 5, 6, 7, 8, 9, 10 列表中最少b 碱基的回文数。

我有一个函数可以转换以 b 为底的数字列表中的数字,以及一个检查列表是否为回文的函数。我不明白为什么我的“x”总是 0。

(define (num->base n b)
  (if (= n 0) 
      '() 
      (append 
         (num->base (quotient n b) b) 
         (list (modulo n b)))))

(define (rev L)
  (if (null? L) '() (append (rev (cdr L)) (list (car L)))))

(define (palindrome? L)
  (equal? L (rev L)))

(define (first-b-pal start b)
  (define x 0)
  (for ([i '(2 3 4 5 6 7 8 9 10)])
    (if (equal? (palindrome? (num->base start i)) #t)
        (+ x 1)
        (+ x 0)
    )
  )
  (display start)
  (display "\n")
  (display x)
  (display "\n")
  (if (> x (+ b 1))
        start
        (first-b-pal (+ start 1) b)
    )
  )

我的想法是,检查有多少个碱基开始回文,如果大于 b 则返回数字,否则使用 start + 1 调用函数,我不明白为什么 x 永远不会递增..

【问题讨论】:

  • + 不会增加任何东西,它只是计算一个总和。所以(+ x 1) 不会增加x
  • @Renzo 那么我应该如何处理它?
  • 100 是回文吗? 00100 是并且是100 的有效表示。顺便说一句,您正在这样做x + 1。在 C# 或 JavaScript 中,这会增加 x 吗?
  • @Sylwester 不,100 不是回文,不,但我不知道如何在 Racket 中使用 x += 1
  • 您基本上是在说回文数是奇数,因为偶数以 0 结尾,并且您永远不会假设第一个非零数字前面的任何无限零都是一部分,因此不是以 2 为基数的回文。

标签: functional-programming racket


【解决方案1】:

它保持0,因为您从不更新绑定。您只使用值 0 作为参数之一。

您使用set! 更新绑定,例如。

(set! x (+ x 1))

但这不是惯用的方式。这是一个例子。想象一下,您想对列表的所有元素求和:

(define (sum lst)
  (define (helper acc lst)
    (if (null? lst)
        acc
        (helper (+ acc (car lst))
                (cdr lst))))
  (helper 0 lst))

(sum '(1 2 3)) ; ==> 6

正如您所见,每次迭代都会更新 acclst 绑定,但虽然它的工作方式相似,但没有发生任何变化。

【讨论】:

  • 你能解释一下绑定是什么吗?绑定是什么意思?为什么是这样的惯用方式?
  • @C.Cristi 这是一个变量。它将名称绑定到对象。当您使用 use set! 时,您将变量绑定的内容(如重定向)更改为不同的值而不更改实际对象。我们还有set-car!,它不涉及任何绑定,但会更改其参数中的对象。 Scheme 被设计为小而递归,它只是真正的控制流,并且由于它用于教学,远离突变使得函数更容易推理。例如。可以使用替换方法来了解正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2012-08-18
  • 1970-01-01
  • 2010-10-06
  • 2016-01-16
  • 1970-01-01
相关资源
最近更新 更多