如何使用递归函数将元素插入列表,然后在 Ocaml 中打印
How to insert elements into a List using a recursive function and then print it in Ocaml
在递归函数中将项目附加到列表的正确方法是什么?
let () =
let rec main m l acc =
if (acc = 3) then
acc
else
if (m = 1) then
l := 1 :: !l
main (m - 1) l
else if (m = 2) then
l := 2 :: !l
main (m - 1) l
else
l := m :: !l
main (m - 1) l
in l = ref []
let main 10 l 0
List.iter (fun l -> List.iter print_int l) l
另一个例子:
let () =
let rec main m =
if (m = 3) then m
else
l := m :: !l;
main (m + 1) l
in l = ref []
let main 0 l
List.iter (fun l -> List.iter print_int l) l
我想在函数内向列表附加一个值,然后打印列表的元素。
如果要打印 [1;2;...;10]:
let () =
let rec main m l =
if (m = 0) then
!l
else begin
l := m :: !l;
main (m - 1) l
end
in
let l = ref [] in
List.iter print_int (main 10 l); print_newline();;
或没有参考更好
let () =
let rec main m l =
if (m = 0) then
l
else
main (m - 1) (m::l)
in
List.iter print_int (main 10 []); print_newline();;
但我不确定你想做什么...
你所说的“正确的方式”是什么意思不太清楚。功能上的“正确方法”是不使用引用。效率“正确的方法”是前置而不是附加。
根据 user4624500 的回答构建列表的另一种直接方法可能是:
let rec f = function
| 0 -> [0]
| n -> n :: f (n-1)
(注意:这不是尾递归,并且会因负数而丑陋地失败...)
然后下面的表达式调用前面的函数来构建列表,然后打印结果(添加换行符以提高可读性):
let my_list = f 10 in
List.iter (fun n -> print_int n; print_newline ()) my_list
在递归函数中将项目附加到列表的正确方法是什么?
let () =
let rec main m l acc =
if (acc = 3) then
acc
else
if (m = 1) then
l := 1 :: !l
main (m - 1) l
else if (m = 2) then
l := 2 :: !l
main (m - 1) l
else
l := m :: !l
main (m - 1) l
in l = ref []
let main 10 l 0
List.iter (fun l -> List.iter print_int l) l
另一个例子:
let () =
let rec main m =
if (m = 3) then m
else
l := m :: !l;
main (m + 1) l
in l = ref []
let main 0 l
List.iter (fun l -> List.iter print_int l) l
我想在函数内向列表附加一个值,然后打印列表的元素。
如果要打印 [1;2;...;10]:
let () =
let rec main m l =
if (m = 0) then
!l
else begin
l := m :: !l;
main (m - 1) l
end
in
let l = ref [] in
List.iter print_int (main 10 l); print_newline();;
或没有参考更好
let () =
let rec main m l =
if (m = 0) then
l
else
main (m - 1) (m::l)
in
List.iter print_int (main 10 []); print_newline();;
但我不确定你想做什么...
你所说的“正确的方式”是什么意思不太清楚。功能上的“正确方法”是不使用引用。效率“正确的方法”是前置而不是附加。
根据 user4624500 的回答构建列表的另一种直接方法可能是:
let rec f = function
| 0 -> [0]
| n -> n :: f (n-1)
(注意:这不是尾递归,并且会因负数而丑陋地失败...)
然后下面的表达式调用前面的函数来构建列表,然后打印结果(添加换行符以提高可读性):
let my_list = f 10 in
List.iter (fun n -> print_int n; print_newline ()) my_list