Recursion “论点”;n-1“;子例程调用的语法错误

Recursion “论点”;n-1“;子例程调用的语法错误,recursion,abap,towers-of-hanoi,Recursion,Abap,Towers Of Hanoi,我想在ABAP中编程一个河内塔求解器 以下是我当前的代码: FORM SOLVE USING s1 TYPE c s2 TYPE c s3 TYPE c n TYPE i. IF n = 1. "move disc from tower X to tower Y" WRITE:/ text-001, text-002, s1, text-003, text-002, s3. ELSE.

我想在ABAP中编程一个河内塔求解器

以下是我当前的代码:

FORM SOLVE USING s1 TYPE c
             s2 TYPE c
             s3 TYPE c
             n  TYPE i.

  IF n = 1.

    "move disc from tower X to tower Y"
    WRITE:/ text-001, text-002, s1, text-003, text-002, s3.

  ELSE.

    PERFORM solve USING s1 s3 s2 n-1. "Here's my problem, n-1 doesn't work"

    PERFORM solve USING s1 s2 s3 1.

    PERFORM solve USING s2 s1 s3 n-1.

  ENDIF.

ENDFORM. 
我的问题:

如果我使用参数(如
n-1
)选择了一个
,SAP会将其识别为一个(不存在)结构,并向我抛出一个错误

有没有办法做到这一点


非常感谢。

您需要在操作员之间添加空间。因此,您需要键入
n-1
。另一方面,旧版本ABAP不支持将内嵌操作数作为函数/执行参数。若您得到错误,首先将结果分配给新变量,然后将其作为参数传递。

您需要在运算符之间添加空格。因此,您需要键入
n-1
。另一方面,旧版本ABAP不支持将内嵌操作数作为函数/执行参数。若出现错误,首先将结果分配给新变量,然后将其作为参数传递。

这是我的解决方案。它工作得很好。感谢大家提供的有用提示

*&---------------------------------------------------------------------*
*& Report  ZS_SANDBOX_TOH
*&
*&---------------------------------------------------------------------*
*& 
*& Datum: 19.09.2018
*& Beschreibung: Lösungsprogramm für das Türme von Hanoi - Problem
*&---------------------------------------------------------------------*

REPORT ZS_SANDBOX_TOH.

PARAMETERS: p_discs TYPE i.

CLASS myclass DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS solve IMPORTING s1 TYPE c
                                  s2 TYPE c
                                  s3 TYPE c
                                  n1 TYPE i.

ENDCLASS.

CLASS myclass IMPLEMENTATION.

METHOD solve.

  IF n1 = 1.

    WRITE:/ 'Lege Scheibe von Turm ', s1, ' auf Turm ', s3.

  ELSE.

    solve( s1 = s1
           s2 = s3
           s3 = s2
           n1 = n1 - 1 ).

    solve( s1 = s1
           s2 = s2
           s3 = s3
           n1 = 1 ).

    solve( s1 = s2
           s2 = s1
           s3 = s3
           n1 = n1 - 1 ).

  ENDIF.

ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

CALL METHOD myclass=>solve( s1 = 'A'
                            s2 = 'B'
                            s3 = 'C'
                            n1 = p_discs ).

这是我的解决办法。它工作得很好。感谢大家提供的有用提示

*&---------------------------------------------------------------------*
*& Report  ZS_SANDBOX_TOH
*&
*&---------------------------------------------------------------------*
*& 
*& Datum: 19.09.2018
*& Beschreibung: Lösungsprogramm für das Türme von Hanoi - Problem
*&---------------------------------------------------------------------*

REPORT ZS_SANDBOX_TOH.

PARAMETERS: p_discs TYPE i.

CLASS myclass DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS solve IMPORTING s1 TYPE c
                                  s2 TYPE c
                                  s3 TYPE c
                                  n1 TYPE i.

ENDCLASS.

CLASS myclass IMPLEMENTATION.

METHOD solve.

  IF n1 = 1.

    WRITE:/ 'Lege Scheibe von Turm ', s1, ' auf Turm ', s3.

  ELSE.

    solve( s1 = s1
           s2 = s3
           s3 = s2
           n1 = n1 - 1 ).

    solve( s1 = s1
           s2 = s2
           s3 = s3
           n1 = 1 ).

    solve( s1 = s2
           s2 = s1
           s3 = s3
           n1 = n1 - 1 ).

  ENDIF.

ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

CALL METHOD myclass=>solve( s1 = 'A'
                            s2 = 'B'
                            s3 = 'C'
                            n1 = p_discs ).

此外,“n-1”被解释为“结构n上的1字段”。正如mkysoft回答的那样,添加空格会将此更改为减法运算。正如您所说,无论版本是什么,表达式都不支持参数,但应该使用表达式,其中。如果我首先将n-1赋值给变量并将其作为参数传递,则算法无法正常工作。对于这个递归解决方案,我需要将n-1作为param传递。。但我会再次尝试,我会尝试使用类和方法。我会尽快将结果发布到这里,因为我把“n-1”解释为“结构n上的1字段”。正如mkysoft回答的那样,添加空格会将此更改为减法运算。正如您所说,无论版本是什么,表达式都不支持参数,但应该使用表达式,其中。如果我首先将n-1赋值给变量并将其作为参数传递,则算法无法正常工作。对于这个递归解决方案,我需要将n-1作为param传递。。但我会再次尝试,我会尝试使用类和方法。我会尽快把结果贴在这里