查找大于
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从不递增。
发布于 2019-12-18 01:21:34
它保持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正如您所看到的,每次迭代都更新acc和lst绑定,但是尽管它的工作方式类似,但没有发生任何变异。
https://stackoverflow.com/questions/59379511
复制相似问题