2014-02-11 50 views
0

我被要求將一些C函數轉換爲方案來分配任務。我的教授非常簡短地介紹了Scheme如何工作,我發現很難理解。我想創建一個函數來檢查哪個數字大於另一個數字,然後在每次輸入新數字時都會檢查。我遇到的問題是變量聲明。我不明白你如何給一個id賦值。在方案中使用局部變量

(define max 1) 

(define (x x) 
    (let maxfinder [(max max)] 
    (if (= x 0) 
     0 
     (if (> max x) 
      max 
      ((= max x) maxfinder(max)))))) 

我一直遇到的麻煩是我想將max初始化爲常量,並修改x。在我看來,當x = 0時,這被設置爲一個帶有退出的無限循環。如果max> x,它不應該是第一次通過,那麼將max =設置爲x,並返回x。我不知道如何處理恆定的最大值。我需要它是一個局部變量。謝謝

回答

0

括號使用非常嚴格。除了特殊的表格,他們被用來調用程序。例如(> max x)調用程序>,其參數爲maxx((if (> x 3) - +) 6 x)是if表單返回過程並調用結果的示例。

  • ((= max x) ...)評估(= max x)由於結果不是一個過程,它會失敗。
  • maxfinder沒有括號只是一個過程對象。
  • (max)將不起作用,因爲max是一個數字,而不是一個程序。

至於你的問題。您可以在命名的let中添加需要更改的額外變量。例如。一個採用數字n並編號爲0-n的列表的過程。

(define (make-numbered-list n) 
    (let loop ((n n) (acc '())) 
    (if (zero? n) 
     acc 
     (loop (- n 1) (cons n acc))))) 

局部變量只是本地綁定的符號。這可以被重寫

(define (make-numbered-list n) 
    (define (loop n acc) 
    (if (zero? n) 
     acc 
     (loop (- n 1) (cons n acc)))) 
    (loop n '())) 

不像Algol方言像C那樣,你不要在循環中變異變量,而是用recusion來改變它們。

好運

0

如果我理解正確的話,你正在尋找一個C函數的靜態變量的等價物。這在Scheme中稱爲closure

這裏是你喂號碼功能的示例實現,並且將始終返回當前最大:

(define maxfinder 
    (let ((max #f))     ; "static" variable, initialized to False 
    (lambda (n)      ; the function that is defined 
     (when (or (not max) (< max n)) ; if no max yet, or new value > max 
     (set! max n))    ; then set max to new value 
     max)))       ; in any case, return the current max 

然後

> (maxfinder 1) 
1 
> (maxfinder 10) 
10 
> (maxfinder 5) 
10 
> (maxfinder 2) 
10 
> (maxfinder 100) 
100 

所以這將工作,但沒有提供任何機制來在不同的上下文中重用該功能。下面更廣義的版本實例化一個新功能在每次調用:

(define (maxfinder) 
    (let ((max #f))     ; "static" variable, initialized to False 
    (lambda (n)      ; the function that is returned 
     (when (or (not max) (< max n)) ; if no max yet, or new value > max 
     (set! max n))    ; then set max to new value 
     max)))       ; in any case, return the current max 

使用這樣的:

> (define max1 (maxfinder)) ; instantiate a new maxfinder 
> (max1 1) 
1 
> (max1 10) 
10 
> (max1 5) 
10 
> (max1 2) 
10 
> (max1 100) 
100 

> (define max2 (maxfinder)) ; instantiate a new maxfinder 
> (max2 5) 
5 
0

定義一個函數來確定兩個數字之間的最大:

(define (max x y) 
    (if (> x y) x y)) 

定義「結束」功能

(define end? zero?) 

定義循環的函數,直到end?計算max

(define (maximizing x) 
    (let ((input (begin (display "number> ") (read)))) 
    (cond ((not (number? input)) (error "needed a number")) 
      ((end? input) x) 
      (else (maximizing (max x input)))))) 

踢其關閉:

> (maximizing 0) 
number> 4 
number> 1 
number> 7 
number> 2 
number> 0 
7