我试图编写一个获取整数作为参数的过程,如果数字是回文,则返回true,否则返回false,并且似乎在内部功能块中更改全局参数值时出现问题。
(define index 0)
(define (palindrome? x)
(if (= (lenght x) 1)
#t
(if (last_equal_first x)
(palindrome? (remove x))
#f)))
(define (lenght x)
(define index **(+ index 1))**
(if (= (modulo x (ten_power index)) x)
index
(lenght x)))
(define (last_equal_first x)
(if (= (modulo x 10) (modulo x (/ (ten_power (lenght x)) 10)))
#t
#f))
我想知道我能做些什么 谢谢!
答案 0 :(得分:1)
嗯,有一个问题是你在使用长度函数后重新定义了索引。 define
并没有真正做到你想要的 - 你想要set!
。
但是,当你尝试不止一次调用长度函数时,我认为你会发现另一个错误 - 你从未在第一次之后将index
设置为0
,所以我相信你的长度函数只会工作一次。
然而,这似乎可能是家庭作业。您是否希望获得有关修复这些问题的明确说明,或者您是否希望了解更多可以了解算法的线索?
答案 1 :(得分:1)
(define ...)
语句在lenght
中的作用是创建一个名为“index”的 new 变量,该变量比您在顶部定义的“索引”更局部作用域。这只是表面问题 - 更重要的是,看起来你正在尝试使用Scheme编写C代码。在像这样的简单作业中,你应该不需要使用全局变量,也不需要在变量创建后更改它。许多程序员在第一次学习函数式编程时很难改变他们的想法。
你写lenght
的方式不仅仅是一个美化的while循环的递归!如果(lenght x)
仅再次调用(lenght x)
,则无法递归。例如,以下是我如何编写digits
来计算数字中有多少个10位数字:
(define digits
(lambda (n)
(letrec ([digit-helper (lambda (n index)
(if (= (modulo n (expt 10 index)) n)
index
(digit-helper n (add1 index))))])
(digit-helper n 0))))
注意一旦变量创建后我永远不会更改变量,但每次只创建新变量。因为我需要跟踪索引,所以我创建了辅助函数digit-helper
,它接受两个参数来掩盖digit
只接受一个参数的事实。