2011-02-26 69 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