2010-02-26 35 views
0

我試圖編寫一個程序,它獲取一個整數作爲參數,如果數字是一個迴文,則返回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)) 

我想知道我能做些什麼吧 的感謝!

回答

1

那麼,一個問題是,你正在使用長度函數後重新定義索引。 define並不真正做你想在這裏 - 你想要set!

但是,我認爲當你嘗試調用函數的長度超過一次,你會發現另一個錯誤 - 你永遠不設置index0後的第一時間,所以我相信你的長度功能只能使用一次。

但是,這似乎可能是一項家庭作業。您是否想要解決這些問題的明確說明,或者您是否希望能夠使您更加了解該算法的線索?

1

什麼是(define ...)說法確實在lenght是創建一個新變量所謂的「指數」比你在上面定義的「指數」更局部範圍。這只是膚淺的問題 - 更重要的是,它看起來像你試圖用Scheme編寫C代碼。在這樣一個簡單的家庭作業中,您應該使用全局變量,而不是而不是,您也不應該在創建變量後再更改變量。許多程序員在第一次學習函數式編程時遇到了轉移想法的麻煩。

你寫出lenght的方式並不像遞歸那麼簡單!如果(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只接受一個參數的事實。