【问题标题】:Scheme Max Function (Recursion)方案最大函数(递归)
【发布时间】:2011-02-26 03:06:15
【问题描述】:

赋值是定义一个函数,接受单个列表作为参数,输出列表的最大值。我觉得我的嵌套“ifs”和“lets”非常多,并且该功能在没有打印答案的情况下过早终止。我已经寻找了一个使用 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)
     )))))

【问题讨论】:

    标签: recursion scheme racket


    【解决方案1】:

    我在您的代码中发现了一些错误:首先,(null? (cadr x)) 类型不正确; x 是一个数字列表,所以 (cadr x) 是一个数字,它永远不会为空。此外,在第二次与let 绑定后,您将不再使用y。您能否尝试用英语描述列表上的max 函数应该做什么?

    【讨论】:

    • 当然,max 函数将一个数字列表作为输入,并返回列表中最大的数字的值。我尝试做的是使用 let 将第一个值指定为最大值(“y”),然后依次遍历每个值并将其与当前最大值进行比较。如果它更大,则 ("y") 采用新值。如果没有其他值,我假设 (cadr x) 将返回 null;而是使用 use (cdr x) 会导致同样的问题吗?
    • @Decency:是的,你应该在测试中使用(cdr x)。你认为应该如何处理递归调用的答案(即假设你有一对(x . z),应该如何处理(max z))?
    • 我不太清楚你所说的这对是什么意思,但我会尽力回应。我希望将递归调用的答案传递出去,并与在程序运行过程中递归获取的每个 (car x) 进行比较。我只是不确定 y 的范围是否会让我这样做,如果可以,该怎么做。我意识到我认为这本质上是一个 do-while 循环,但我不知道这是否是这种语言的正确方法。
    • @Decency:假设x是列表的carm是列表cdr的最大元素。整个列表的最大值应该是多少?
    • 整个列表的最大值应该是 x 或 m,以两者中的较大者为准。这就是我打算用我的第二个 if 语句来测试的,一次一个元素。
    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多