2017-08-08 39 views
-3

我要代表使用遞歸函數(沒有特別的原因,這一事實)多邊形鏈的下列進化:如何寫一個遞歸函數R中有一個列表作爲輸入和輸出

step 1. The chain starts with 2 line segments and is (of course) opened; 
step 2. close the polygonal chain with a new line segment; 
step 3. open the polygonal chain; 
step 4. GOTO 2 

我想要得到一個帶有「時間(步數)」,「鏈狀態指示(打開/關閉)」,「線段數(邊)」的列表。我創建了下面的腳本,但是我犯的一個錯誤是沒有停止條件。我感謝我的帖子的評論員。我想我解決了這個問題。下面我會試着用一個新腳本來回答我自己的問題。

recursive.d <- function(d){ 
    t <- d[[1]] 
    a <- d[[2]] 
    k <- d[[3]] 
    a <- !a 
    t <- t + 1 
    k <- ifelse(a, k + 1, k) 
    d <- list(t, a, k) 
    d <- rbind(d[], recursive.d(d[])) 
    return (d) 
} 

d_ini <- list(0, TRUE, 2) 
recursive.d(d_ini) 

但事實上,輸出是Error: C stack usage 7970888 is too close to the limit。我做錯了什麼?

+3

1 )爲什麼你需要遞歸? 2)你的代碼中的停止條件是什麼/哪裏? 3)你能真正描述你想做什麼 - 你的代碼沒有任何意義。 – Dason

+0

沒有基礎的情況。在命中任何可以返回的行之前,你需要命令'd < - rbind(d [],recursive.d(d []))'(涉及遞歸調用)。當然,你吹的堆棧。這是一個無限循環的遞歸等價物。 –

+0

1)我需要遞歸,因爲我想在這種情況下使用它。這不是出於實際原因或獲得某些結果; 2)我沒有停止條件。我試圖用k == 5作爲停止,但函數只返回5; 3)這段代碼沒有意義,因爲它的形式非常抽象且帶有字母。我試圖產生一個列表,其中第一個成員計算時間(1,2,3,...),第二個成績在TRUE或FALSE之間,第三個成員計算一個取決於列表中其他兩個成員的數字。 – sbac

回答

0

在 「○高級威登柏格」 (葡萄牙語)link to book

recursive.d <- function(d){ 
    t <- d[[1]] # time 
    a <- d[[2]] # desire true/false 
    k <- d[[3]] # edges 
    k <- ifelse(a, k + 1, k) 
    a <- !a 
    d <- list(t+1, a, k) 
    if (t == 10) return(NA) # stop condition 
    else 
    d <- rbind(d[], recursive.d(d[])) 
    return (d) 
} 

d_ini <- list(1, TRUE, 2) 
desire <- rbind(d_ini, recursive.d(d_ini)) 
colnames(desire) <- c("Time", "Desire", "Edges") 
desire 

結果慾望 的演變基於戈卡洛·M·塔瓦雷斯, 「慾望」 的表示:

Time Desire Edges 
d_ini 1 TRUE 2  
     2 FALSE 3  
     3 TRUE 3  
     4 FALSE 4  
     5 TRUE 4  
     6 FALSE 5  
     7 TRUE 5  
     8 FALSE 6  
     9 TRUE 6  
     10 FALSE 7  
     NA NA  NA 
+0

...所以你只是想生成你的數據的前十個元素?您可以輕鬆地將要生成的元素數作爲參數包含在函數中。 – Dason

+0

是的,這些只是前十個元素。我停止了'''t == 10'''的條件。我想我解決了這個問題。現在我想用一系列開放/封閉的多邊形來表示它。對不起,我沒有把你作爲參數的元素數量的觀察。好主意!我試圖用R來描述一篇文學文獻:-) – sbac

相關問題