我正在尝试在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
不起作用时。
我该如何解决?
答案 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;