簡體   English   中英

在方案中使用局部變量

[英]Using local variables in scheme

有人要求我將幾個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。 我不知道如何處理常數max。 我需要它是一個局部變量。 謝謝

括號的使用非常嚴格。 除了特殊形式,它們還用於調用過程。 例如(> 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 '()))

與像C這樣的Algol方言不同,您不會在循環中對變量進行變異,而是使用重新排列來更改它們。

祝好運

如果我正確理解您的要求,那么您正在尋找的是C函數的靜態變量的等效項。 這在Scheme中稱為閉包

這是您向其輸入數字的函數的示例實現,該函數將始終返回當前的最大值:

(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

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

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

定義一個函數以“結束”

(define end? zero?)

定義一個循環循環直到end?的函數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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM