有界变量和范围

时间:2010-02-26 14:24:01

标签: scheme

我试图编写一个获取整数作为参数的过程,如果数字是回文,则返回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))

我想知道我能做些什么 谢谢!

2 个答案:

答案 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只接受一个参数的事实。