2015-05-29 27 views
-2

我是Racket編程的新手,我想知道如何定義一個可遞歸調用的方法,並具有三個參數(三個數字)。 我知道如何定義函數和變量,但我很困惑這裏主要是關於多個參數。具有多個參數的遞歸方法

謝謝!

回答

0

可以遞歸地調用所有Racket(方案)函數,但是爲了工作,它們必須被適當地設計。這總是取決於你想要做什麼,你沒有提到。事實上,三個數字都不需要遞歸。遞歸最常用於迭代由列表組成的數據結構。所以更可能的情況是一個函數,採用三個數字(或金額)的列表:

(define (sum lst) 
    (if (null? lst) 0 
    (+ (car lst) (sum (cdr lst))))) 

(sum '(1 2 3))  => 6 
(sum '())   => 0 
(sum '(1 2 3 4 5 6)) => 21 

更有效的實現將使用傳遞運行總和的遞歸調用一個輔助功能,允許一個尾巴呼叫 - 這不會增加堆棧。

(define (sum lst) 
    (define (sum-helper lst sum) 
    (if (null? lst) sum 
     (sum-helper (cdr lst) (+ (car lst) sum)))) 
    (sum-helper lst 0)) 

你會注意到sum-helper有一個額外的參數,你已經詢問過了。正如你所看到的,函數調用只是一個列表 - 只要你想(在合理的範圍內)。第一個符號是功能,其餘的是參數。

如果這還不夠,請提供更多詳情。

+0

對「如何定義和調用函數?」調用X-Y問題。真的嗎? –

+0

我在stackoverflow的第一個答案,我得到這個? 我不熟悉你的「X-Y」問題,對不起。如果我抓住了你的偏見,你認爲他在問如何定義和調用一個我無法回答的函數。但是,如果您再次閱讀該問題,您會看到OP知道如何定義函數。我將其作爲特別針對遞歸函數/調用的請求來讀取。無論如何,你必須承認OP的問題相當模糊。我不能說你的答案更有幫助。 – lewisbrown

+0

OP知道如何定義單參數函數,例如'(define(f x)x)'。他特別說他在這裏「主要在多個參數上感到困惑」,而你原來的答案基本上是「你爲什麼要寫一個多參數函數?」即使您編輯的迴應也會忽略OP的主要關注點並顯示單參數功能。 –

-1
(define (takes-three-args a b c) 
    (takes-three-args (* 2 c) (+ 1 b) (/ 1 a))) ;; Loops Forever and consumes 
               ;; an ever-increasing amount of memory. 
+0

這似乎是一個很好的算法選擇來回答問題,尤其是考慮到您對其他答案的迴應。 –

+0

什麼算法? OP想要知道如何定義一個多於一個arg函數和如何進行遞歸,並且我定義了一個多於一個arg遞歸函數,而編寫其他答案的人基本上是這麼說的:「爲什麼你會曾經想寫一個多參數函數?「 (雖然他自編輯他的答案以顯示一些代碼,但使用一個只接受一個參數的函數,明確地忽略了OP說他對多參數函數特別困惑,而且它甚至沒有尾部重新啓動。) –