Некоторые проблемы, не связанные напрямую с вашим вопросом: вы не возвращаетесь со всех путей в лямбда-выражении, dfs(0,0)
слишком мало параметров и isInterleave
ничего не возвращает. Я просто добавил несколько операторов return
, не обращая внимания на лог c.
Как упоминалось в комментарии, вы не можете (напрямую) использовать лямбду, пока не известен ее тип. С косвенным уровнем это можно сделать:
bool isInterleave(string &s1, string &s2, string &s3) {
auto dfs = [&](auto F,int i, int j,int k) {
if (k > s3.length()) {
return true;
}
if (s1[i] == s3[k]) {
return F(F,i + 1, j, k + 1);
}
else return false;
};
return dfs(dfs,0, 0,0);
}
Более простой пример, чтобы увидеть, что это действительно работает:
#include <iostream>
int main(){
auto recurse = [](auto F,int i,int j){
if (i == 0) return j;
return F(F,i-1,j+i);
};
std::cout << recurse(recurse,5,0);
}
Вывод: 15
(= 5 + 4 + 3 + 2 + 1 + 0)