我被要求将几个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 :(得分:0)
括号使用非常严格。除了特殊形式,它们还用于调用程序。例如(> max x)
调用带有参数>
和max
的过程x
。 ((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方言不同,你不会在循环中改变变量,而是使用recusion来改变它们。
祝你好运答案 1 :(得分: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
答案 2 :(得分: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