ADA的河内递归计划。
到目前为止,我认为我的大部分内容已经失效,我的问题在于我的解决功能。 我认为我的算法很好,但我不知道如何将它实现到函数中,我看到的所有使用它的例子都是使用自身内部的函数,例如: Example
我的错误是:
hanoi.adb:23:09: cannot use function "solve" in a procedure call
hanoi.adb:27:09: cannot use function "solve" in a procedure call
hanoi.adb:59:15: missing ")"
到目前为止,这是我的代码。
with ada.text_io, ada.command_line;
use ada.text_io, ada.command_line;
procedure hanoi is
Argument_Error : EXCEPTION;
max_disks, min_disks : integer := 3;
moves : integer := 0;
verbose_bool : boolean;
function solve (N: in integer; from, to, using: in character) return integer is
begin
if N = 1 then
if verbose_bool = true then
put("Move disk " & integer'image(N) & " from " & character'image(from) & " to " & character'image(to));
end if;
else
solve(N - 1, 'A', 'B', 'C');
if verbose_bool = true then
put("Move disk " & integer'image(N) & " from " & character'image(from) & " to " & character'image(to));
end if;
solve(N - 1, 'B', 'C', 'A');
end if;
moves := (2 ** min_disks) - 1;
return moves;
end solve;
begin
while min_disks /= max_disks loop
IF Argument_Count > 1 THEN
if Argument_Count = 1 then
min_disks := integer'value("Argument(1)");
elsif Argument_Count = 2 then
min_disks := integer'value("Argument(1)");
max_disks := integer'value("Argument(2)");
elsif Argument_Count = 3 then
min_disks := integer'value("Argument(1)");
max_disks := integer'value("Argument(2)");
if argument(3) = "v" or argument(3) = "V" then
verbose_bool := true; -- if argument is V or v it is true
end if;
END IF;
END IF;
IF Argument_Count > 3 THEN
RAISE argument_error;
END IF;
if (max_disks > 0) then
solve (N: integer; from, to, using : character);
END IF;
min_disks := min_disks + 1;
end loop;
EXCEPTION
WHEN Name_Error =>
Put_Line("Please re-enter your arguments, check to see if you entered integers and characters. Max of 3 arguments.");
WHEN OTHERS =>
Put_Line("Please try to not break the program again, thank you.");
end hanoi;
答案 0 :(得分:7)
函数返回值,过程没有,并且您已将Solve定义为函数。
Ada要求您使用函数的返回值执行某些操作,而您在此处未执行此操作。 (您不能像在其他编程语言中那样忽略返回的结果。)
正如错误消息所述,您的语法是进行过程调用,即调用过程,但是您提供了函数的名称。
如果从函数返回的值有意义,则根据其目的对其进行操作。如果它没有提供任何有意义的功能,请将其删除并将Solve定义为过程。
答案 1 :(得分:1)
另外,您可能希望将显示代码重新分解为嵌套的子程序。在下面的大纲中,procedure Print
可以访问procedure Solve
。
procedure Solve (N: in Integer; From, To, Using: in Character) is
procedure Print is
begin
if Verbose then
...
end if;
end Print;
begin
if N = 1 then
Print;
else
Solve (N - 1, 'A', 'B', 'C');
Print;
Solve (N - 1, 'B', 'C', 'A');
end if;
end Solve;
答案 2 :(得分:0)
除了Marc关于调用Solve不是正确的Ada函数引用的注释之外,你所拥有的语法是规范而不是Solve的调用。你在Solve的身体中没有在初始调用中使用它:
if (max_disks > 0) then
solve (N: integer; from, to, using : character);
END IF;