2011-02-26 70 views
1

该分配用于定义一个函数,该函数接受单个列表作为参数,并输出列表的最大值。我觉得我的嵌套“ifs”和“let”非常过量,并且功能过早终止而不打印答案。我已经找到了一个使用递归正确使用的例子,但已经空了,DrRacket中的调试功能对于通过递归调用进行跟踪并不是非常有用。方案最大功能(递归)

任何帮助表示赞赏,谢谢。

(define max 
(lambda (x) 
    (let ((y (car x))) 
    (if (null? (cdr x)) 
     y 
     (let ((m (max(cdr x)))) 
      (if (> m y) 
       m 
       y) 
    ))))) 

回答

2

我在代码中看到一些错误:首先,(null? (cadr x))不是类型正确的; x是一个数字列表,因此(cadr x)是一个数字,它永远不会为空。另外,您在第二次与let绑定后不使用y。你能不能用英文来描述清单上的max函数应该做什么?

+0

当然,max函数将一个数字列表作为输入,并返回列表中最大的数字值。我试图做的是使用let将第一个值指定为最大值(“y”),然后逐个遍历每个值并将其与当前最大值进行比较。如果它更大,(“y”)会有一个新值。 我假设(cadr x)如果没有其他值,将返回null;会改为使用使用(cdr x)导致相同的问题? – 2011-02-26 03:27:07

+0

@Decency:是的,你应该在测试中使用'(cdr x)'。你认为应该用递归调用的答案来做什么(即,假设你有一对'(x。z)',应该用'(max z)')来做什么? – 2011-02-26 03:28:53

+0

我不太确定这一对你的意思,但我会尽力回应。我希望递归调用的答案能够被传递,并与在程序运行中递归获取的每个(汽车x)进行比较。我只是不确定y的范围是否会让我这样做,如果可以的话,如何去做。我意识到我正在将它看作基本上是一个do-while循环,但我不知道这是否是这种语言的正确方法。 – 2011-02-26 03:37:00