2016-10-24 3 views
3

私はしかし、私は出力としての価値が、全体を取得しない再帰的な目的球再帰関数とRでナップザック動的計画

n <- c(0,1,2,3,4) 
v <- c(10,40,30,50) 
w <- c(5,4,6,3) 
k <- 10 


myfunction <- function(n,k){ 
    if (n==0 | k==0){ 
    output <- 0 
    } else if (w[i] > k) { 
     output <- myfunction[i-1,w] 
    } else { 
     output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k)) 
     } 
return(myfunction) 
} 

でナップザックプログラムを解決するためにRで、この単純なコードを作成しました関数。たとえば、次のように入力した場合: myfunction(4,10)

私は90の値を取得しませんが、すべての機能が終了しました。

enter image description here

これらは@etienneによって指摘さのものを越えて、いくつかのエラーが発生しました値

+1

をあなたは 'リターン(MyFunctionを)' 'リターン(出力)'を使用してはいけません。また、関数で 'i'を使用していますが、定義されていないため、関数を修正する必要があります。 – etienne

答えて

5

です。注釈付きデバッグセッションがあります。それはiにする必要があります示唆して長さがゼロである明らかに

> myfunction <- function(n,k){ 
+ if (n==0 | k==0){ 
+ output <- 0 
+ } else if (w[i] > k) { 
+   output <- myfunction[i-1,w] 
+ } else { 
+   output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k)) 
+  } 
+ return(output) 
+ } 
> myfunction(4,10) 
Error in if (w[i] > k) { : argument is of length zero 

どちらワットもK:まず、返されたオブジェクトを修正します。 (エティエンヌも指摘しているように)。あなたのコードを見ると、実際にはiが終了条件が満たされるまで減少したインデックスになると思われます。だから、登場少数の例でinを置き換える:

> myfunction <- function(i,k){ 
+ if (i==0 | k==0){ 
+ output <- 0 
+ } else if (w[i] > k) { 
+   output <- myfunction[i-1,w] 
+ } else { 
+   output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k)) 
+  } 
+ return(output) 
+ } 
> myfunction(4,10) 
Error in myfunction[i - 1, w] : 
    object of type 'closure' is not subsettable 

だから、あなたも(世界の非米国セクションでブラケット別名)括弧が必要とされた角括弧を使用してのミスを犯しました

> myfunction <- function(i,k){ 
+ if (i==0 | k==0){ 
+ output <- 0 
+ } else if (w[i] > k) { 
+   output <- myfunction(i-1,w) 
+ } else { 
+   output <- max(v[i]+ myfunction(i-1, k-w[i]),myfunction(i-1,k)) 
+  } 
+ return(output) 
+ } 
> myfunction(4,10) 
[1] 90 

成功、ほぼ、ほぼ。あなたが条件文の一つに|代わりの||を使用しているため、警告のほとんどは、以下のとおりです。

Warning messages: 
1: In if (i == 0 | k == 0) { : 
    the condition has length > 1 and only the first element will be used 
2: In if (w[i] > k) { : 
    the condition has length > 1 and only the first element will be used 
3: In if (i == 0 | k == 0) { : 
    the condition has length > 1 and only the first element will be used 
4: In if (i == 0 | k == 0) { : 
    the condition has length > 1 and only the first element will be used 
5: In if (i == 0 | k == 0) { : 
    the condition has length > 1 and only the first element will be used 
6: In if (i == 0 | k == 0) { : 
    the condition has length > 1 and only the first element will be used 

だから、論理||でそのインスタンスを置き換えます。あなたのロジックを妨害していない他の警告に対処するには、の場合、w[i]は長さ0であることを認識しているので、最初にその可能性についてテストし、正しい "ダブルAND記号「(&&):

myfunction <- function(i,k){ 
    if (i==0 || k==0){ 
    output <- 0 
    } else if (length(w[i]) && w[i] > k) { 
     output <- myfunction(i-1,w) 
    } else { 
     output <- max(v[i]+ myfunction(i-1, k-w[i]), myfunction(i-1,k)) 
     } 
return(output) 
} 

今、あなたが得る:

> myfunction(4,10) 
[1] 90