Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Ruby中使用递归循环时追加数组_Arrays_Ruby_Recursion - Fatal编程技术网

Arrays Ruby中使用递归循环时追加数组

Arrays Ruby中使用递归循环时追加数组,arrays,ruby,recursion,Arrays,Ruby,Recursion,我正在用Ruby进行工作,并在n=1时停止。 这是我目前掌握的代码: def collatz(n) arr = [] if n == 1 arr << n return arr elsif n % 2 == 0 n = n / 2 arr << n collatz(n) else n = (3 * n) + 1 arr << n collatz(n) end end def

我正在用Ruby进行工作,并在n=1时停止。 这是我目前掌握的代码:

def collatz(n)
  arr = []
  if n == 1
    arr << n
    return arr
  elsif n % 2 == 0
    n = n / 2
    arr << n
    collatz(n)
  else
    n = (3 * n) + 1
    arr << n
    collatz(n)
  end

end
def collatz(n)
arr=[]
如果n==1

arr将数组添加到参数,例如:

def collatz(arr, n)
  if n == 1
    arr << n
    return arr
  elsif n % 2 == 0
    n = n / 2
    arr << n
    collatz(arr, n)
  else
    n = (3 * n) + 1
    arr << n
    collatz(arr, n)
  end
end

puts "#{collatz([], 10).join(', ')}"
但请记住:递归是一种邪恶

在递归中:

def collatz(n)
  arr = []
  loop do
    n = n % 2 == 0 ? n / 2 : (3 * n) + 1
    arr << n
    break if n == 1
  end
  arr
end

puts "#{collatz(10).join(', ')}"
def collatz(n)
arr=[]
环道
n=n%2==0?n/2:(3*n)+1
arr您可以使用此代码

如果n是1,则像
Array
一样返回它。 如果n%2==0,则使用n/2,否则使用(3*n)+1。 如果n现在是1,则像
Array
一样返回它,否则用n值定义新的
Array
,并用新的n调用自己

def collatz(n)
  return [n] if n == 1
  n = n % 2 == 0 ? n / 2 : (3 * n) + 1
  n == 1 ? [n] : [n] + send(__method__, n)
end
输出

p collatz(10)
# => [5, 16, 8, 4, 2, 1]

我希望这有助于

为什么递归是邪恶的?递归是邪恶的,因为它限制了您的能力,并限制了最大的调用堆栈限制。它(调用堆栈限制)取决于您的语言和计算机,但它不是无限的。
p collatz(10)
# => [5, 16, 8, 4, 2, 1]