sas中的斐波那契数的递归函数

时间:2019-01-29 19:22:13

标签: sas

我正在尝试在SAS中定义递归函数,如下所示

%macro f(n);
%if &n<=1 %then %put f(&n)=&n;
%else %put f(&n)=%eval(f(%eval(&n-1))+f(%eval(&n-2)));
%mend;

但是当i>=2不起作用时。

我该如何解决?

2 个答案:

答案 0 :(得分:3)

递归宏非常不典型。使用Proc DS2并在其中实现方法,您将获得更好的递归编程经验。

无论如何,您必须了解宏不是正常的函数式编程语言;它是具有副作用的源代码生成器。您的宏可能不会发出任何源代码,而只是为副作用而编程,或者可能被编写为根据模板发出源代码,而没有其他副作用。

%macro fib(n);

  %if &n < 0 %then %abort cancel;

  %if &n = 0 %then 
    0 /* emit source code 0. The %if is a recursion sentinel */
  ;
  %else 
  %if &n = 1 %then 
    1 /* emit source code 1. The %if is a recursion sentinel */
  ;
  %else %do;
    /* emit source code that is side effect of eval summing recursive invocation */
    %eval (
      %fib(%eval(&n-1)) + %fib(%eval(&n-2))
    )
  %end;

%mend;

%put %fib(0);
%put %fib(1);
%put %fib(2);
%put %fib(3);
%put %fib(4);
%put %fib(5);
%put %fib(6);

发出的最终结果来自宏设施(子系统)。

%fib(6)代码生成是

%put
    %eval (    
      %eval ( /* 5 */
        %eval ( /* 4 */
          %eval ( /* 3 */
            %eval ( /* 2 */
              1 /* 1 */
              +
              0 /* 1 */
            )
            +
            %eval ( /* 1 */
              1
            )
          )
          +
          %eval ( /* 2 */
            1 /* 1 */
            +
            0 /* 1 */
          )
        )
        +
        %eval ( /* 3 */
          %eval ( /* 2 */
            1 /* 1 */
            +
            0 /* 1 */
          )
          +
          %eval ( /* 1 */
            1
          )
        )
      )
      +
      %eval ( /* 4 */
        %eval ( /* 3 */
          %eval ( /* 2 */
            1 /* 1 */
            +
            0 /* 1 */
          )
          +
          %eval ( /* 1 */
            1
          )
        )
        +
        %eval ( /* 2 */
          1 /* 1 */
          +
          0 /* 1 */
        )
      )
    )
;

答案 1 :(得分:2)

%macro f(n);
%if &n<=2 %then 1;
%else  %eval(%f(%eval(&n-1))+%f(%eval(&n-2)));
%mend;