gpt4 book ai didi

R:初级问题:函数上的递归函数

转载 作者:行者123 更新时间:2023-12-02 17:53:41 25 4
gpt4 key购买 nike

我有一个问题。我在线阅读解决方案的主要问题是我无法理解其中 95%,因为答案通常技术性太强。

问题:我创建了一个返回一个答案的基本函数。现在我需要使相同的函数重复 N/2 次并返回 N/2 个答案。

基本功能如下。用户向函数输入变量N。假设他输入N=100,函数生成列表a、列表b和列表c。然后该函数计算达到条件的次数并返回计数值。在基本情况下,列表 b 使用列表 a 的前 10 个元素创建,列表 c 使用剩余的 N-10 个元素创建。

f <- function (N) {
count <- 0
for (nn in 1:100) {
a <- sample(1:N)
b <- a [1:10]
c <- a [11:N]
pass <- which(c>=max(b))
if (length(pass) == 1) {
count <- count + 1
}
}
return (count)
}

answer <- f(100)
answer

递归函数必须使这个基函数重复 N/2 次。列表b和c的拆分不再基于10个元素和(N-10)个元素。现在基于 1) 1, N-1 个元素,然后 2) 2, N-2 个元素,然后 3) 3, N-3 个元素,依此类推,直到 N/2 情况(即两个列表均等分割) )。

因此我尝试了这个,但它不起作用。我需要一个可以生成 N/2 个答案的递归函数,这是每种情况的一个答案。由于我对编程非常陌生,我希望这些建议能够明确。我可能没有能力理解隐式代码和部分代码。

感谢大家如此友善并花时间帮助他人。

f <- function (N) {
for (mm in 1: N/2) {
number <- list()
count <- 0
for (nn in 1:100) {
a <- sample(1:N)
b <- a [1:mm]
c <- a [mm+1:N]
pass <- which(c>=max(b))
if (length(pass) >= 1) {
count <- count + 1
}
}
number[mm] <- count
}
}

answer <- f(100)
answer
# NULL

乐于助人的评论者(奥利弗)提出的最新编辑代码如下。但它只适用于一种情况。基本上,该函数尝试将 100 个随机数的列表分成 2 部分:b 和 c。然后它尝试查看 c 是否恰好包含一个比 b 中的最大数字大的数字。 for 循环(mm in 1:(N/2))模拟 b 和 c 的连续切片 Action 。它以 1 开始,以 50 (N/2) 结束。当为1时,b有1个元素,c有100-1个元素,当为2时,b有2个元素,c有98个元素......最后一种情况是b和c都有50个元素。

f <- function (N) {
for (mm in 1: (N/2)) {
number <- list()
count <- 0
for (nn in 1:100) {
a <- sample(1:N)
b <- a [1:mm]
c <- a [mm+1:N]
pass <- which(c>=max(b))
if (length(pass) == 1) {
count <- count + 1
}
}
number[mm] <- count
}
number
}

bb <- f(100)
bb

[[46]]
NULL

[[47]]
NULL

[[48]]
NULL

[[49]]
NULL

[[50]]
[1] 26

如果代码正常工作,[46]、[47]、[48] 和 [49] 的预期答案应为 20+ 并且不为 NULL。我相信代码为 number[mm] <- count没有按预期工作。我相信number[mm]未成功传输至最终代码number除了 number[50]传输正确。

最佳答案

欢迎来到SO,感谢您提出了一个精心设计的问题。

首先要说清楚。递归是指在同一函数内调用函数,如下面的(不是很明确)示例所示:

f <- function(x){
some code
n <- f(x2)
some more code
return(x3)
}

现在解决你的问题。你已经接近你想要的答案了。在此过程中发生了三件事,

  1. 记住你的括号。
  2. 返回输出
  3. 重置 number在每次迭代时。

1.R从左到右读取代码,并且在计算代码时会非常严格。 1:N/2相当于 1: N/2相当于 c(1, 2, ..., N) / 2 。您正在寻找1:(N/2)seq(1, N/2) ,您可能想使用 floorceiling对于 N/2 的舍入不均匀结果,如5/2=2.5 , 13/2=6.5等等

对于 2.,您当前没有从函数中返回任何内容。在 R您可以使用 return(...) 显式返回一个值,或者您可以简单地键入对象/数字作为函数中的最后一件事。

对于 3,请注意,在外循环中,您正在调用 number <- list() 。在外循环的每次迭代中,这将重置计数列表,从而删除任何先前的答案。这应该被移动

将这些放在一起,得到正确的代码片段相当于下面的示例:

f <- function (N) {
number <- list() # <=== initiate your canister only once.
for (mm in 1:(N/2)) { #<=== remember parenthesis. Or use seq(1, N/2)
count <- 0
for (nn in 1:100) {
a <- sample(1:N)
b <- a [1:mm]
c <- a [mm+1:N]
pass <- which(c>=max(b))
if (length(pass) >= 1) {
count <- count + 1
}
}
number[mm] <- count
}
number #<== or return(number)
}

我不介意给出一些一般性建议,但我不太清楚该功能的总体情况是什么。

关于R:初级问题:函数上的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58129298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com